もよいめも

不定期更新ものづくりブログ

ラズパイ起動時にプログラムを自動実行させる

いやはや、私の苦労は一体なんだったのでしょうか。
数日間できないできないと戦っていた「プログラムの自動実行」。詳しい方に聞いたら一瞬で出来ちゃいました。それもめちゃくちゃ簡単に。
ということで今回は「ラズパイ起動時にプログラムを自動実行させる方法」について書いていこうと思います。

ステップ1「なんか開く」

私はソフトウェア系はあんまりやってないので適当ですが勘弁してください。
という事でターミナルに
「sudo leafpad /etc/rc.local」
と入力します。
するとテキストエディターが開きます。
f:id:moyoi:20190115064158j:plain

ステップ2「書く」

開いたテキストエディターの一番下に「exit 0」と書いてあると思いますのでその上に起動したいプログラムの種類とフルパスを書き込みます。私の場合はデスクトップにあるbolvider.pyというpythonファイルを実行したかったので
「python3 /home/pi/Desktop/bolvider.py」
と記入しました。
f:id:moyoi:20190115064240j:plain

ステップ3「再起動」

再起動すると上手くいっていればプログラムが自動実行されます。
再起動したらCPU使用率が上がった↓

f:id:moyoi:20190115064618j:plainf:id:moyoi:20190115064623j:plain
なお、デスクトップでは何も表示されないのでご注意を。
上手くいかない場合はおそらくステップ2で書き込んだ内容が間違っています。
私もはじめ、
python /home/pi/Desktop/bolvider.py」
と書き込んでうまくいきませんでしたが、python3と記入したところ無事起動しました。まあ、ターミナルに書き込んでちゃんと起動するか調べてから実際にファイルに書き込んだほうがいいかもしれませんね。

pythonだけのときはエラーが出てるのがわかります。(python3の時も出ていますがこれはプログラム本体のエラーです)
f:id:moyoi:20190115064753j:plain

【画像認識】OpenCV初心者がネジ識別プログラムを作ってみた

今回は部活でのうっとうしいネジ分けから解放されるべく第一歩として、OpenCVで「ネジ識別プログラム」を作ってみたので、それについて書いていこうと思います。

開発環境

今回はanaconda3を入れるといっしょについてくるSpyderという開発環境にOpenCVを入れてプログラムしました。

spyderの画面
spyder
自動整形がないのが残念ですが割と使いやすかったです。

プログラム

とりあえず今回作った(大半コピペ)プログラムを張っておきます。しかし、初めてのOpenCV という事もあり、しっかり覚えておきたいので今回は細かく説明していこうと思います。そのため、プログラム中のコメント等はすべて削除しています。
↓今回のプログラム

import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

cam = cv2.VideoCapture(1)
_,img = cam.read()

lookUpTable = np.empty((1,256), np.uint8)
for i in range(256):
    lookUpTable[0,i] = np.clip(pow(i / 255.0, 0.5) * 255.0, 0, 255)
img_gamma = cv2.LUT(img, lookUpTable)

img_gray = cv2.cvtColor(img_gamma, cv2.COLOR_BGR2GRAY)
img_blur = cv2.GaussianBlur(img_gray, (5,5), 0)
_, img_binary= cv2.threshold(img_gray, 130, 255, cv2.THRESH_BINARY_INV)

contours = cv2.findContours(img_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]

def draw_contours(ax, img, contours):       
    ax.imshow(img)
    ax.axis('off')
    for i, cnt in enumerate(contours):
        cnt = np.squeeze(cnt, axis=1)
        ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2))
        ax.plot(cnt[:, 0], cnt[:, 1], 'ro', mew=0, ms=2)
        ax.text(cnt[0][0], cnt[0][1], i, color='b', size='20')

fig, ax = plt.subplots(figsize=(6, 6))
draw_contours(ax, img_gamma, contours)

for i, cnt in enumerate(contours):
    rect = cv2.minAreaRect(cnt)
    (cx, cy), (width, height), angle = rect
    rect_points = cv2.boxPoints(rect)
    ax.add_patch(Polygon(rect_points, color='g', fill=None, lw=2))
    
    if width<height:
        kei=int(width)
        nag=int(height)
    else:
        kei=int(height)
        nag=int(width)
    print('番号:',i)
    print('縦:',kei,'横',nag)       
    L = 0
    if 44<=kei<=52:
        M = 3
    elif 55<=kei<=65:
        M = 4
    else:
        M = 0
    if M == 3 and 100>nag>80 or M == 4 and 110>nag>100:
        L = 8
    elif M == 3 and 78 >= nag >= 67 or M == 4 and 100 >= nag > 70:
        L = 5
    if M == 0:
        print('認識できませんでした')
    else:
        print('径:','M',M)
    if L == 0:
        nag = 11*nag/100-3
        L = int((nag + 4) / 5) * 5
    if M != 0:
        print('長さ:',L,'mm')

plt.show()

画像認識用のカメラとライトについて

プログラム解説の前に画像認識用のカメラとライトについて説明します。
今回は友人から借りたウェブカメラを使って画像認識していきます。
画像認識の方法より、白と黒のコントラストが重要になってくるため、一定の明るさで画像を撮る必要があります。そのため、簡単な撮影用の小道具を作りましたので紹介します。

撮影用の台
撮影用の何か
こんな感じでペットボトル飲料の上下を切りとってそこに蓋をしてハイパワーLEDと、穴をあけてウェブカメラをつけました。
撮影用の台の内部
撮影用の何かの内部
ちなみにLEDはUSBのバスパワーでつけています。
LED電源及びウェブカメラのUSB
LED電源及びウェブカメラのUSB

プログラム解説

では、1行目から解説していきます。

import cv2
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Polygon

ここは、ただライブラリ等を入れているだけなので省略


#VideoCapture オブジェクトを取得
cam = cv2.VideoCapture(1)
#一コマ分の画像を取得してimgに代入
_,img = cam.read()

cv2.VideoCapture(1)の()の中の数字ですが、0だとパソコンの内臓カメラの画像になったので、おそらく指定するカメラの番号だと思います。


#ガンマ処理を行って画像を明るく
lookUpTable = np.empty((1,256), np.uint8)
for i in range(256):
    lookUpTable[0,i] = np.clip(pow(i / 255.0, 0.5) * 255.0, 0, 255)
img_gamma = cv2.LUT(img, lookUpTable)

撮影した画像は私の使っているウェブカメラだと少し画像が暗いのでガンマ処理を行って明るくします。
どの程度明るくするかは、lookUpTable[0,i] = np.clip(pow(i / 255.0, 0.5) * 255.0, 0, 255)の「0.5」の部分を変更することで行えます。


#画像を白黒画像にする
img_gray = cv2.cvtColor(img_gamma, cv2.COLOR_BGR2GRAY)
#画像を少しぼかす
img_blur = cv2.GaussianBlur(img_gray, (5,5), 0)
#画像を完全な白と黒の画像(二値画像)に
_, img= cv2.threshold(img_blur, 130, 255, cv2.THRESH_BINARY_INV)

画像認識の下処理として画像を完全な白と黒の画像にしなければなりません。さらにその下処理としてまずはカラー画像を白黒(グレーも含む)にします。
その後、細かいノイズを処理するために画像をぼかします。ちなみにぼかし具合はimg_blur = cv2.GaussianBlur(img_gray, (5,5), 0)の「(5,5)」の値を変えることで変更できます。
そして、最後に画像を完全な白と黒の画像(二値画像)にして下処理は終了です。


#二値画像から輪郭を検出
contours = cv2.findContours(img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[1]

画像imgの黒い背景から白い物の輪郭を検出します。
検出した輪郭はcontoursにリストとして代入されます。


fig, ax = plt.subplots(figsize=(6, 6))    
ax.imshow(img_gamma)
ax.axis('off')
for i, cnt in enumerate(contours):
    cnt = np.squeeze(cnt, axis=1)
    # 輪郭の点同士を結ぶ線を描画する。
    ax.add_patch(Polygon(cnt, color='b', fill=None, lw=2))
    # 輪郭の点を描画する。
    ax.plot(cnt[:, 0], cnt[:, 1], 'ro', mew=0, ms=2)
    # 輪郭の番号を描画する。
    ax.text(cnt[0][0], cnt[0][1], i, color='b', size='20')

img_gammaの上に輪郭の線を書きます。
これと、この下のプログラムは参考サイトのほとんどそのままなので、詳しい説明はそちらのほうを見てください。


for i, cnt in enumerate(contours):
    # 輪郭に外接する回転した長方形を取得する。
    rect = cv2.minAreaRect(cnt)
    (cx, cy), (width, height), angle = rect
    # 回転した長方形の4点の座標を取得する。
    rect_points = cv2.boxPoints(rect)
    # 回転した長方形を描画する。
    ax.add_patch(Polygon(rect_points, color='g', fill=None, lw=2))

ネジを囲む長方形も描画します。


#取得した長方形の縦横の長さを比べて、長いほうをnag,短いほうをkeiに代入
 if width<height:
        kei=int(width)
        nag=int(height)
    else:
        kei=int(height)
        nag=int(width)
 #取得した長方形の番号をコンソール画面に表示します。
    print('番号:',i)
 #取得した長方形の縦横の長さをコンソール画面に表示します。
    print('縦:',kei,'横',nag)       
 #取得した縦横の値をからネジの径や長さを割り出します。
    L = 0
    if 44<=kei<=52:
        M = 3
    elif 55<=kei<=65:
        M = 4
    else:
        M = 0
    if M == 3 and 100>nag>80 or M == 4 and 110>nag>100:
        L = 8
    elif M == 3 and 78 >= nag >= 67 or M == 4 and 100 >= nag > 70:
        L = 5
    if M == 0:
        print('認識できませんでした')
    else:
        print('径:','M',M)
    if L == 0:
        nag = 11*nag/100-3
        L = int((nag + 4) / 5) * 5
    if M != 0:
        print('長さ:',L,'mm')

ここは完全オリジナルのプログラムで、
ひたすら画像認識させて縦横の長さの傾向を調べ
そこからぶりぶり計算してネジの径や長さを割り出せるようにしました。


#画像を表示します。
plt.show()

ここで画像を表示します。

感想とか

今回、初めて画像認識をしてみましたが、OpenCV が便利すぎて正直めちゃくちゃ楽だったです。
私の中で画像認識ブームが到来してきました。

今現在、画像認識した結果をArduinoを間に挟んでLCDに表示しようとしているのですが、こっちのほうが難しいですね。
LCD表示できるようになったらまた記事を書くので、どうぞお待ちください。

ESP32で遊んでみた~uPyCraftを使ってLチカ編~

前回はESP32にプログラムを書き込むためにuPyCraftをインストール&初期設定をしたので、今回は実際にプログラミングをしていきたいと思います。

f:id:moyoi:20181112143557j:plain

まずは接続

まず初めにESP32とuPyCraftを接続します。
おそらく、右のオレンジの部分の鎖アイコンの「Connect」を押せばつながると思いますが、もしつながらなかった場合は前回の記事の初期設定をやり直してみてください。
ちなみに、ESP32とuPyCraftが接続されると画面下に
>>>
と表示されます。

upycraft接続完了の画面
接続されたらこうなります

ESP32でLチカに挑戦

ESP32とuPyCraftの接続が完了したら、早速Lチカに挑戦してみましょう。
有難いことに例が標準で入っているのでそのプログラムを使ってみます。

f:id:moyoi:20181113151131p:plain

今回はこの中の「blink.py」を使います。
↓一応プログラムを張っておきます。

#hardware platform: FireBeetle-ESP32
#Result: Blink
#The information below shows blink is unavailble for the current version.
#IO0 IO4 IO10 IO12~19 IO21~23 IO25~27
#Except the connection between IO2 and onboard LED, other pins need to connect to external LEDs. 

import time
from machine import Pin
led=Pin(2,Pin.OUT)        #create LED object from pin2,Set Pin2 to output

while True:
  led.value(1)            #Set led turn on
  time.sleep(0.5)
  led.value(0)            #Set led turn off
  time.sleep(0.5)

led=Pin(2,Pin.OUT) とありますが、2番ピンは基板上のLEDと初めからつながっているので、今回はLED等はつなぎません。
では、書き込んでいきましょう。
書き込みは右のオレンジの部分の三角マークの「DownloadAndRun」を押してください。
書き込みが完了するとすぐに基板の上のLEDが光りだすと思います。

ピンからもしっかりと出力されているかLEDをさして試してみましょう。
ピンの位置はAmazonに貼ってあったやつで探します。

f:id:moyoi:20181114055945j:plain

画像では下のほうにUSBのコネクタがある感じなので、2番ピンは右の下から5番目。GNDは右の一番上を使います。

無事に点灯しました。
ちなみにですが、プログラムの上のコメントに「IO0 IO4 IO10 IO12~19 IO21~23 IO25~27のピンは現在のバージョンでは利用できない」などと書いてあるのですが、試しに使ってみたら問題なく使えたのでよくわかりませんでした。

という事で今回はここまでです。
次回はセンサーの値を読んでみようと思います。しかし、テストが近くなってきたので更新がかなり遅れてしまうかもしれません、ご了承ください。


↓次の記事はこちら↓
申し訳ありません。現在作成中です。

ESP32で遊んでみた~uPyCraftインストールと初期設定編~

今日は奮発してAmazonでESP32を購入しましたので、それについて何回かに分けて書いておこうと思います。

↓購入したESP32↓

使用したIDE

このマイコンArduino IDEを使ってプログラムを書き込むこともできますが、今回はPythonを勉強したかったので「uPyCraft」というMicroPythonを使ったIDEを使います。

uPyCraftのダウンロードおよび初期設定方法

まず、ここから本体をダウンロードしてください。
ここ→ About · GitBook

uPyCraftのアイコン画像
uPyCraftのアイコン
ダウンロードした蛇のアイコンの.exeファイルを開くとまず、フォントをインストールしろと言われ、デスクトップにフォントファイルが作成されuPyCraftが起動します。(作成されたフォントファイルをインストールしても何も変わらないので無視してOK)
するとアップデートを促すウィンドウが出てくると思うのでOKを押してください。
ダウンロードが完了するとアップデート前の.exeファイルがあったところと同じ場所に最新のバージョンの.exeファイルがダウンロードされていると思いますので、古い.exeファイルは消してしまって結構です。

ドライバのインストール

初め、サブ機として使っているノートパソコンを使ってESP32に接続を試みたのですが、接続しようとするとソフトが固まってしまって一向に接続できませんでした。しかし、メインのデスクトップpcでは問題なく接続できたので何が問題か探ってみると、ドライバーが入っていなかったことが原因であったことがわかりました。
おそらくこのドライバは私が過去に自分で入れたものなので新たにインストールする必要がありますので、

↓こちら↓
jp.silabs.com

からファイルをダウンロードして展開し、適切なインストーラーを起動してインストールをしてください。

ESP32との接続

upycraftの画面
upycraftの画面
ソフトを起動しただけではESP32とはまだつながらないので初期設定をします。
まず、右上のメニューバーの中の「Tools」の中の「Serial」を開いた状態で、ボードのケーブルを抜き差しして出てくるCOM番号を選択してください。
すると初期設定をするウィンドウが出てくるので指示に従って初期設定をしてください。
初期設定が完了するともうESP32にプログラムを書き込める状態となります。

次回は早速ESP32にプログラムを書き込んで遊んでみようと思います。

↓次の記事はこちら↓
moyoi-memo.hatenablog.com

PC版″荒いスマブラ″こと「Stick Fight: The Game」が楽しい

皆さん、スマブラこと大乱闘スマッシュブラザーズはご存じでしょうか。
たくさんの有名ゲームキャラクターたちがそれぞれの必殺技を駆使して戦う戦闘ゲームで、相手を吹っ飛ばしたときの爽快感はなんとも言えないものです。
しかしながらスマブラは、専用のゲーム機がないとプレイできません。
更に、マップも限られているので、ずっとプレイしているとマップに飽きてきてしまうかもしれません。
しかし私は、そんな悩みを解消する最高のゲームを見つけました。

(↓スナイパーでヘッドショットの図)
f:id:moyoi:20181109062901p:plain




↓Stick Fight: The Gameの購入はこちらから↓
store.steampowered.com



Stick Fight: The Gameとの出会い

私はスマブラを持っていなかったのですが、ある日自宅に友人が3人来たとき、4人でマルチプレイをしようと言うことになりました。
しかし、手元には2人でのマルチプレイが限界なゲームしかなかったため、steamで4人で遊べて安いゲームを探していました。
すると、4人で遊べて、なおかつ500円で買えてしまう「Stick Fight: The Game」を発見しました。
早速購入、ダウンロードを行いゲームを起動してプレイしてみると、
思った以上に楽しい。
キャラクターは色が違うだけでなんの特徴もありませんが、キャラクターを選ぶ手間がなく、皆平等に出来ますし、ゲームも非常に単純でテンポがよく、友人たちで楽しくプレイすることが出来ました。

ゲームの内容とか操作方法とか

ゲームの内容としては、2Dのマップ上でただひたすらプレイヤー同士で殴りあったり、ランダムに降ってくる武器で撃ったり刺したりして、最後の一人になるまで戦うといった非常に単純なものです。
武器の種類は、一般的な銃からあり得ないような威力の銃。また、槍や剣などがあります。
マップは初期状態で80ほど、さらにエディター機能もあるので、
自分でマップを作ったり、他のプレイヤーの作成したフィールドで遊ぶこともできます

(↓エディター画面)
f:id:moyoi:20181109063807p:plain

操作方法も非常に簡単で、マウスで攻撃と防御と体の向きの調節、キーボードで左右上下の移動や武器を投げたりできます。
マルチプレイをする場合は、ゲームパッドを繋げるだけで簡単にプレイできます。
ただし、ゲームパッドによっては体の向きの調節が難しく、相手に銃口をうまく向けられなかったりしますのでご注意下さい。
また、オンラインプレイも簡単には出来て手軽に世界のプレイヤーとゲームをすることができます。ゲーム内でのチャットも可能なので、簡単なコミュニケーションを取ることも可能です。

(↓オンラインプレイのエントリールーム)
f:id:moyoi:20181109063155p:plain

ちなみにゲームは日本語には対応していませんが、読めなくても全く問題なくプレイできるので安心してください。

最後に、このゲームは結構重いです。
パソコンの性能ががそれなりにないとカックカクになってしまうと思うので、パソコンのスペックと相談して購入してください。
過去に私の低スぺサブノート(下にレビュー記事を張ってあります)に入れてプレイしてみたらカックカクでパソコンがめちゃくちゃ熱くなってしまいました。

moyoi-memo.hatenablog.com



ということで、是非ともあなたも「Stick Fight: The Game」で思いっきり暴れちゃいましょう!

Core m3ってどうなの?~NECのLAVIE(NM350/G)を半年使ってみて~

今回は、私が愛用しているサブノートpcのLAVIE(NM350/G)について、使い始めてから半年がたったのでレビューを書こうと思います。
f:id:moyoi:20181025160344j:plain
(↑エンブレムシールはメインPCのCPUに付いてきたi7のに付け替えてネタにしていましたが剥がれてしまったのでまた買います)

値段やら性能やら

このパソコンは10万ちょっとぐらいで家電量販店で購入しました。
簡単に性能を紹介しますと
CPU:Intel Core m3-7Y30
メモリ:4G
ストレージ:SSD 119G
OS:windows10 64bit
といった感じです。
自宅にCore i7 6700K搭載のメイン自作デスクトップPCがあるので、持ち運び用という事で性能は控えめです。
(デスクトップPCのことはまた今度書きたいと思います。)

性能に関して

このPCでする作業は、調べ物をしたり、簡単なプログラミングをしたり動かしたりといった簡単なことなので性能はまあ十分ですね。
3DCADも割とストレスなく動かせました。
しかし、昔重めのゲーム(下に記事を張っておきます)を入れてみたときは、一応動きましたがPCがめちゃくちゃ熱くなりました。まあ、ファンレス設計なのでしょうがないですね。

moyoi-memo.hatenablog.com


電池の持ちも、朝フル充電にしておけば、家に帰るまで充電は必要がない程度には持ちます。

その他

まず、大きさに関してですが、コンパクトで非常にいい感じです。
重量も軽く、自転車で移動する私にとってはとてもいいノートPCだと思います。厚さも割とあるので、パンパンのカバンに突っ込んでも安心感があります。

最後に物足りない点ですが、今のところ特にありません。
強いて言いますと、なんだか音がこもることや、画面がもう少し開いたらよかった、といったことだけです。
あ、でも最近、なぜかファイル等を新規作成しようとすると固まってしまう謎の症状が出始めました。まあこれはアップデート等でいつか治ると思ますが。(治りました。)


私的には最高のノートPCですね。Core m3は初めてだったのでどんな感じか気になっていたのですが、結構いい感じです。
あとは、DVD,CDドライブがついていなかったのが少し痛いくなるかなと思っていましたが、DVDやCDはあまり使わないので外付けで十分ですね。

という事でLAVIE(NM350/G)は結構使えるヤツだったので手ごろなノートPCをお求めの方は一度考えてみてはいかかでしょうか。

500円で、骨伝導?イヤホンを買ってみた話

私は普段自転車で40分ほどかけて通学しているのですが、その時間がもったいなくてしょうがありませんでした。この時間を有効活用できたらいいのに...。しかし、そんな日々を過ごしていた私にうってつけの商品をネットで見つけました。その名も「骨伝導イヤホン」
いやまあ、前からこういうイヤホンがあることは知っていたのですが結構高くて手が出せなかったのです。
しかし、なんとこの商品は500円ほどで買えてしまい、ついでにBluetooth
これは買うしかない。

そして約1ヶ月後。ついに届きました。
f:id:moyoi:20181024115257j:plain
おお、いいフォルム。あとめっちゃ軽い。
早速耳に装着してみるとあんまり安定感がないです。しかし頭を振っても落ちることはなさそう。
では、電源を入れてみます。
「パワーオン」とアナウンスの声が。結構音が割れてますね。
あと、すっとザーザーとかピーピーとかの雑音が聞こえます。まあ、500円なのでこれくらいは我慢します。
さて、スマホにつないでみましょう。どうやら起動した時点でペアリングモードに入るようなので早速ペアリングします。
しかし、スマホBluetooth設定を見てみると。あれ?
f:id:moyoi:20181024120756j:plain
なんかおかしいですが問題なくつながりました。
さて、早速ネットラジオでも流して聞いてみましょう。
んんんんーー…
何だろう、骨を伝ってきている感じはしません。一度外してみると結構音がもれてますね。んん?これは?
f:id:moyoi:20181024142036j:plain
何だか穴が開いています。マイクかとも思いましたがマイク用の穴は下に空いているので違いそう。
耳を近づけるとなんだかここから音が出ている気もします。
これは怪しい。

という事で開けてみました。
f:id:moyoi:20181024142423j:plain
あれ、なんだか骨伝導できそうな部品がはいってますね。
f:id:moyoi:20181024142612j:plain
試しに大音量でネットラジオを流してみると振動しているような気もします。
試しにもう一度耳に装着して耳をふさいでみると

ちょっとだけ聞こえる。

確かに普段とは違う音が聞こえます。これが骨伝導なのでしょうか。
まあ、ちゃんとしたもので聞いたことがない私にはわかりませんでした。
しかしながら、イヤホンとしてはしっかりと機能してくれましたし、なんといっても500円なので十分な性能なのではないでしょうか。

でも今度はしっかりしたものを買いたいですね。

SONY XperiaZ3がサブ機として有能な話

f:id:moyoi:20181023093359j:plain
私はメイン端末としてAQUOS R compact(SH-M06)を使っていますがもう一台、サブ機としてdocomoのXperiaZ3(SO-01G)も普段持ち歩いています。
このXperiaは最近友人からもらったものですが、かなりサブ機として有能だったので、今回はそれについて詳しく書いていこと思います。

カメラが良い!

この記事でも書いたように
moyoi-memo.hatenablog.com
AQUOS R compactのカメラは起動が遅かったりスローがなかったりと、自分にとっては物足りないものでした。
しかし、XperiaZ3のカメラは、すぐに起動して貴重な瞬間をさっととることができますし、欲しかったスローの機能も付いています。
あとはシャッターボタンもついていてとても使いやすいです。
さらに言いますと実はこちらのほうがAQUOSよりも最大画素数が多いんですよね。いやはや、最高です。

オーディオが良い!

このスマホは友人からウォークマン&いらないスマホと交換してもらったのですが、そのウォークマンはノイズキャンセル機能が壊れてしまっていました。
私はノイズキャンセル機能を結構使っていたのでかなり残念だったのですが、XperiaZ3はノイズキャンセル機能が使えます。
さらにハイレゾにも対応しています。(ハイレゾイヤホン等は持っていませんが)
なんだか、友人に申し訳ないです。

SIMカードをそのまんま差し替えられる!

メイン端末のAQUOS R compact(SIMフリーモデル)にはビッグローブのSIMを入れているのですが、なんと回線がdocomoのものなのでSIMカードを入れ替えればネットも電話もできるようになります。(なおテザリング機能は使えません)
これで、AQUOSのバッテリーが底をついてさらにはモバイルバッテリーもなく充電できないといったときにも安心です。
ついでにXperiaZ3はバッテリーの容量が3100mAもあるので中古とはいえバッテリーは十分持ってくれます。

そのほかの機能も地味に便利!

私も初めて知りましたが、この世代のXperiaにはラジオ機能があったんですよね。
これ、地味に欲しかったんです。
ネットラジオだとネットを使っているのでなんだかもったいない気もするし、遅延もしていたので好きじゃなかったのですが、これで解決です。
さらにフルセグも見れます。
一応AQUOS R compactにもテレビ機能はついているのですがワンセグしか見られなかったのでちょうどよかったです。
あとはスピーカーの音質がいいですね、上下のスピーカーで、最大音量でもはっきりとした音を聞くことができます。

これがあったらもうメイン端末

これ、もうメイン端末でよくない?と思った方もいると思いますがいくつか足りないものがあるのです。
まず、androidのバージョンが6.0.1で止まってしまっていること。
せめて7.0ぐらいまで行ってくれれば申し分ないのですが、少し残念です。
次に指紋認証がない。
いやまあ、昔使っていた端末は勿論指紋認証なんてなかったのですが、一度慣れてしまうともう、ないとつらいですね。
そしてでかい。
いやはや、私の手には少し大きいです。
とはいえ、サブ機としてはめちゃくちゃ有能です。
次買う端末はXperiaにしてもいいかな…

ボストン・ダイナミクスのロボットを踊らせた動画が面白い

ボストン・ダイナミクスのロボットである「ビッグドッグ」などはかなり多くの人が見たことがあるのではないでしょうか。
あのロボロボしい見た目、あの動きから、恐怖感を持った人も多くいると思います。私もその一人で、ちょっと怖いなと思っていました。
しかし、ボストン・ダイナミクスYouTubeに投稿したロボットを躍らせてみた動画を見て、ボストン・ダイナミクスの自分の中での印象がかなりアップしました。
とりあえず、あなたもこれを見てみてください。

UpTown Spot
すごいですよね。
ロボットとは思えない滑らかな動きだと思います。
まずあのバランス力、足が2本しか設置していなくても全くふらつく様子もなく、正面から横向きにジャンプするなど、様々な動きをしています。
あとは長い首を空中に固定したまま体を動かしたり、足を滑らせたり。
いや~、面白い。
首をリズムに合わせて振ったり、カメラに向いて口(?)を動かしたりなどするのも、なんだか愛嬌があります。
にしても、技術の進歩はすさまじいです。
ついこの前までは2足歩行だけですごかったのに、今ではこの動画のようにロボットが滑らかに踊ったり、
華麗なジャンプを決めて障害物をどんどん飛び越えて行ったりと、もはや人間の運動能力を超えそうです。(もう超えてるかも?)
あとは空間を認識する能力が上がればもう、人間の運動能力を超えるでしょう。
ちょっと楽しみではありますが、同時に怖くもあります。ロボットが街を歩き回るのはやっぱり怖いです。
でもまあ、そんなこと言ってられないのかもしれませんね。

【Arduino】ArduinoでRTC(DS3231)を簡単に使ってみた

今回は代表的なRTCのDS3231をArduinoで使ってみたので、簡単にまとめておこうと思います。
2022年12月時点でライブラリのアップデートされ、当記事のプログラムでは使用できなくなりました。
ライブラリのバージョン2.0.0以上を使用する場合は↓の記事をごらんください!

moyoi-memo.hatenablog.com

今回使うRTC

今回はAmazonで買ったRTC(DS3231)を使っていきます。

このRTCには充電式のボタン電池LIR2032(付属しません)をつけることができ、外部からの電源がなくても時間のデータを保持することができます。
なお、ボタン電池は絶対にLIR2032を使うようにしてください。普通のボタン電池でも勝手に充電しようとしてしまいますので、爆発するとかしないとか...
一応基板上のダイオードを外すことで充電機能を無効にすることもできるようですが、今回は紹介しません。

Arduinoとの接続方法

今回はArduino nanoでの配線方法を説明します。

RTC側     Arduino

VCC  →  5V
GND  →  GND
SDA  →  A4(SDA)
SCL  →  A5(SCL)

以下の画像も参考にしてください。Arduino UNOのバージョンも載せておきます。

配線の仕方


プログラムの方法

まず、ライブラリーをインストールしましょう。
こちらからライブラリーをZIP形式でダウンロードします。
github.com
そして、Arduino ideのメニューのスケッチ→ライブラリーをインクルード→zip形式のファイルをインストールからダウンロードしたファイルを選択します。ソフトを再起動させれば導入は完了です。

では現在の時間とRTCの時間を合わせます。
おそらくpc内時計の時間を取得してそのまま反映させることも可能だと思いますが、プログラムが少しわかりにくくなってしまうので、今回は手動で値を入力して設定していきます。(どうでもいいですがこのプログラムが完成した時刻で設定しています。)

#include <DS3232RTC.h>//ライブラリーをインクルード

void setup() {
  setTime(12, 40, 0, 15, 10, 2018);//時、分、秒、日、月、年の順で入力
  RTC.set(now());//書き込み
}

void loop() {
}

では、しっかりと書き込めたか確認してみましょう。

#include <DS3232RTC.h>//ライブラリーをインクルード

void setup() {
  Serial.begin(115200);
}

void loop() {
  tmElements_t tm;
  RTC.read(tm);
  Serial.print(tm.Year + 1970, DEC); //年は1970年からの年数で記録されるので1970を足して表示
  Serial.print("年");
  Serial.print(tm.Month, DEC);//月を表示
  Serial.print("月");
  Serial.print(tm.Day, DEC);//日を表示
  Serial.print("日");
  Serial.print(tm.Hour, DEC);//時を表示
  Serial.print("時");
  Serial.print(tm.Minute, DEC);//分を表示
  Serial.print("分");
  Serial.println(tm.Second, DEC);//秒を表示して改行
  delay(1000);//1間隔で表示させるため1秒待機
}

このプログラムを書き込んだ後にシリアルモニター(115200bps)を見て

2018年10月15日12時45分3
2018年10月15日12時45分4
2018年10月15日12時45分5
2018年10月15日12時45分6

などと表示されていれば成功です。

さて、次はRTCのアラーム機能を使ってみましょう!…と思ったのですが、
結構プログラムが面倒くさいんですよね。
という事で私はいいことを思いました。
先ほど時刻を表示するプログラムを作りましたよね?
つまり、Arduinoで時刻を数字として読み込めていることになります。
では
その読み込んだ数字を直接if文で比較してしまえばいいのです。

#include <DS3232RTC.h>//ライブラリーをインクルード

void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT);//13番ピンを出力ピンに設定
}

void loop() {
  tmElements_t tm;
  RTC.read(tm);
  Serial.print(tm.Year + 1970, DEC); //年は1970年からの年数で記録されるので1970を足して表示
  Serial.print("年");
  Serial.print(tm.Month, DEC);//月を表示
  Serial.print("月");
  Serial.print(tm.Day, DEC);//日を表示
  Serial.print("日");
  Serial.print(tm.Hour, DEC);//時を表示
  Serial.print("時");
  Serial.print(tm.Minute, DEC);//分を表示
  Serial.print("分");
  Serial.println(tm.Second, DEC);//秒を表示して改行

  if (tm.Second == 0) {//ここで秒の数字が入ったtm.Secondの値が0秒かどうか判断
    digitalWrite(13, HIGH);//0なら13番ピンをオン
  }
  else {
    digitalWrite(13, LOW);//0でない場合は13番ピンをオフ
  }
  delay(1000);//1間隔で表示させるため1秒待機
}

このプログラムを実行すると秒が0になるたびにArduinoのLEDが1秒点灯するようになると思います。
このようにすることで非常に簡単にアラームを設定することができます。
(時間や分ごとにアラームを設定したい場合は、tm.Secondをそれぞれtm.Hourやtm.Minuteに変更してください)

それでは、よいArduinoライフを!

【Arduino】Arduinoで中央値などの記述統計をする方法

皆さん、Arduinoでプログラミングをしているときに、中央値とか最大値とかの「記述統計」をしたいと思ったことはないでしょうか。

私が軽く調べたところ、Arduino ideで記述統計をする方法を解説しているサイトは全然なく、私自信やり方がわからず苦労しましたので、今回ここにその方法を書いておこうと思います。

記述統計をしてくれるライブラリー

Arduino ideには簡単な統計をしてくれるライブラリーがあります。

それはずばり「QuickStats」ライブラリーです。

(公式の解説ページArduino Playground - QuickStats)

このライブラリーでは、平均、幾何平均、最大値、最小値、標準偏差、標準誤差、変動係数、絶対値、中央値などを求めることができます。

導入方法

まず、ここからライブラリーのデータをzip形式でダウンロードします。

github.com

そして、Arduino ideのメニューのスケッチ→ライブラリーをインクルード→zip形式のファイルをインストールからダウンロードしたファイルを選択します。ソフトを再起動させれば導入は完了です。

使い方

今回は私の情報量の関係で使い方を説明するのは、平均、最大値、最小値、中央値、絶対値のみとさせていただきます。
なお今回は、センサー等で取得した値についてこのライブラリーを使うといった場合で説明します。

#include "QuickStats.h"//ライブラリーをインクルード
int numreadings = 10;//記述統計をしたい値を入れるための配列を作成
float readings[10];
float n;//センサー等の値代入用の変数を作成

void setup ( ) {
  Serial.begin(115200);
}

void loop ( ) {
  for (int i = 0; i <= 9; i++) {
    //ここらへんでセンサー等の値を取得して変数nに代入
    readings[i] = n; //センサー等の値を配列に代入(このnをiに変えることでプログラムのテストを行うことができます)
  }
  QuickStats stats;//QuickStatsを初期化
  Serial.print("平均値:");
  Serial.println(stats.average(readings, numreadings));//平均値を表示
  Serial.print("最小値:");
  Serial.println(stats.minimum(readings, numreadings));//最小値を表示
  Serial.print("最大値:");
  Serial.println(stats.maximum(readings, numreadings));//最大値を表示
  Serial.print("中央値:");
  Serial.println(stats.median(readings, numreadings));//中央値を表示
}

ちなみに変数nをコメントの通りにiにかえると
平均値が4.5
最小値が0
最大値が9
中央値が4.5
といった値が返ってくると思います。
配列に代入した値が0~9なのでちゃんと計算されてますね。
使用例としては、複数の値の中央値や平均値をとることでセンサーの値のブレの軽減などに使えるかなと思います。

では、よいArduinoライフを!

AQUOS R compact(SH-M06)を半年使っての感想

私のメインスマホであるAQUOS R compact(SH-M06)を使いはじめてから、もう半年が経ちました。
今回はAQUOS R compactを使ってきての感想を書いていこうと思います。
f:id:moyoi:20181010204049j:plain

AQUOS R compactを選んだ理由

条件を箇条書きにしますと
Android
SIMフリー
・compactモデル
・性能高め
などを重視して決めました。
最終的にはXperia XZ1 compactとAQUOS R compactで悩んだのですが、おサイフケータイワンセグが付いているAQUOSに決定したといった感じです。

半年使っての感想

まずは悪かった面から紹介します。

・時々動作が遅くなる

結構良いCPUを積んでいるはずなのですが、Googleアシスタントを呼び出す時や、カメラ起動する際など結構重くなります。

・カメラ機能がもっとほしかった

画質は十分なのですが個人的にはスローとか欲しかったです。

・ちょっと重いかも(物理的に)

他のスマホと比べるとちょっと重いかもしれません。厚みもそれなりにあります。



次に良い面です。

・操作しやすい

私手が小さい方なのでcompactモデルにしたのですが、期待通りの操作性です。

AQUOS便利機能が便利

朝起きたときなどに勝手に天気予報などを教えてくれるエモパーや、
指紋センサーをナビゲーションキーに変えられる機能が地味に便利です。

・充電が早い

バッテリーの容量が少ないということもありますが1時間30分もあればフル充電できます。


まあ、正直に言って大きな可もなく不可もないといった感じですね。

バッテリーの持ちについて

実験で今回紹介した『なめらか倍速表示機能』では電池の持ちはほとんど変化しないことがわかりました。
moyoi-memo.hatenablog.com

これを含めて考えると
バッテリーの持ちは普通です。

さて、ここからが私の言いたかったことです。
私が一番AQUOS R compactで残念だったのは電池の持ちが悪いことでした。
キャリア版ではかなり電池の持ちがいいという噂を耳にしていたのですが実際に使ってみるとギリギリ1日持つ位で、普段よりネットニュースなどを読んでしまうともう電池が切れてしまうといった具合でした。

しかし、私はついに原因を発見しました。

その原因はズバリ「なめらか倍速表示」機能でした。
ディスプレイ点灯時の電池の減りがかなり早く、画面の省エネ性を売りにしているAQUOSなはずなのにおかしいなと思っていました。
そしてある日なめらか倍速表示の機能のことを思い出しました。この機能は液晶のフレッシュレートを通常の倍の早さするというもので、消費電力が増えるのもわかります。
そして機能をOFFにすると違いは目前。
1日使いまくっても十分持ち、控えめに使っていれば50%近くもバッテリーがもちました。
でも、あの指に吸い付くような操作感は結構好きだったので少し残念です。今後のアップデートでもう少し改善されるといいですね。

さて、AQUOSのバッテリーの持ちに不安をお持ちの方は是非ともこの項目をチェックしてみてください。

ブログ始めました。

どうも初めまして、矢場博と申します。

いやはや、ついに私もブログデビューです。

前からブログをやっている人を見ていて、私もやってみたいと思っていたのですが、面倒くさそうでなかなか一歩を踏み出せずにいましたが、ついに決心がつき、学校のお昼休みにパパっと作ってみました。

色々飽きやすい私ですが、暇つぶしがてらにちょこちょこ進めていけるようにしていきたいと思っています。

あ、あとタッチタイプも完璧にしたいですね。

このブログを選んだ理由

初めはラズパイにWordpressをいれてがっつり稼いでやろうとかおもっていたのですが、なんといってもめんどくさい。

実際にWordpressを入れようと試みたのですが、PHPが入らないやら、SSLが有料やら、セキュリティ対策もしなきゃいけないなどのどで駆け出しの私にはハードルが高すぎてギブアップしてしまいました。

でもやっぱりあきらめたくないと思い、今度はよさそうなブログサイトを探し始めました。

最終的にFC2ブログはてなブログで迷いましたが、ラズパイにWordpressを入れようとしていたときに参考にしたブログがはてなブログだったのでこちらにしました。

記事もとても簡単に作れていい感じです。

まあ、お金が欲しくなったらはてなブログproのほうにはいればいいので、いつかやってみたいですね。

今後の計画と目標

このブログでは私の趣味である電子工作(Arduinoメイン)についてのメモを書いていこうと考えています。まあときどきそれ以外のメモも書くと思いますが。

私が電子工作をする際、様々なブログを参考にしていますが、結構自分の作りたいものについてのものはないことが多いです。そんなものについてどんどん書いていきたいなと思っています。

目標としてはブログで稼げるようになりたいです。月々1000円も稼げればうれしいです。