物づくりの小部屋

個人で活躍するクリエーターになりたい現役エンジニアの行動記録

【ラズパイ】Raspberry Pi4のカメラ機能をテストする(Kuman カメラモジュール SC25-JP)

こんにちは。alohaです。

 

Raspberry Pi4にはオプション部品としてカメラモジュールが用意されています。

今回カメラ機能のテストを行うため、Kumanのカメラモジュール「SC25-JP」を購入しました。

安価ながら、周囲の明るさを検出して自動で夜間モードに切り替えを行う優れもの。

Amazonで¥3,399)。

 

今回、カメラモジュールの接続 → 撮影 → 画像処理機能の確認 を行ったので、その結果を書き残しておきます。

 

  • カメラモジュールの接続
  • 接続確認
  • 静止画像の撮影
  • 画像処理
  • 動画撮影
  • OpenCVのインストール

 

<カメラモジュールの接続>

Raspberry Pi4のカメラ接続コネクタの黒色のロックを上に引き上げて外し、カメラモジュールのフラットケーブルを差し込みます。その後、コネクタのロックを戻せばカメラモジュールの接続は完了です。

カメラモジュール自体は、プリント版とフラットケーブルがあるだけなので、レンズの向きを決まった姿勢に固定することができません。そこで、下の写真のようにカメラモジュールを固定する台を3Dプリンタで作成しました。

いい感じ。

 

<接続確認>

Rasberry Pi4側で接続したカメラモジュールを認識できるか確認します。

ターミナルを起動して以下のコマンドを実行します。

$ vcgencmd get_camera

「supported=1 detected=1」と表示されれば接続OKです。

 

<静止画像の撮影>

続いて、静止画像のスナップショットを撮影します。

同じくターミナルから以下のコマンドを実行すると、画面にプレビューが表示された後、

「 /home/pi 」に画像ファイルが保存されます。

$ raspistill -v -o test.jpg

部屋を暗くすると、カメラモジュールから「カチッ」と音がして夜間モードに切り替わります。テストはしていませんが、追加で赤外線ライトを追加する事で、夜間モードの撮影ができる様です。

 

プレビューは、Raspberry Pi4のHDMI端子にモニターが接続されている場合のみ表示されます。VNCでRaspberry Pi4にリモート接続している場合はプレビュー画面は表示されないので注意が必要です。

 

撮影した写真がピンぼけしている場合は、カメラモジュールのレンズを回してピントを調整しうます。

 

<画像処理>

静止画像を撮影できる状態になったので、撮影した写真に処理を加え、指定した解像度、ファイル名で保存するシンプルなプログラムを作成します。

#coding:utf-8

#モジュールをインポート
import picamera
import time

with picamera.PiCamera() as camera:
    
    #解像度を指定
    camera.resolution = (320,240)
    
    #プレビュー
    camera.start_preview()
    time.sleep(1)
    camera.stop_preview()
    
    #画像処理
    #sketch, emboss, negative, pastel, gpen 等
    camera.image_effect ="sketch"
    
    #ファイルに保存
    camera.capture("test_picture.jpg")

プログラムの19行目で撮影した写真に処理を加えています。

画像処理の例は以下の通りです。

 

処理なし

sketch

emboss

negative

pastel

gpen

 

<動画撮影>

カメラモジュールを使うことで動画の撮影もできます。

以下のテストプログラムでは、10秒間の録画を行い、プログラムと同じフォルダに動画ファイルを作成します。

#coding: utf-8

#モジュールのインポート
import picamera
import time

with picamera.PiCamera() as camera:
    
    #解像度を指定
    camera.resolution = (320,240)
        
    #録画開始
    camera.start_preview()    
    camera.start_recording(output = "test_movie.h264")
    
    #録画時間は10秒
    camera.wait_recording(10)
    
    #録画停止
    camera.stop_preview()
    camera.stop_recording()

OpenCVのインストール>

プログラミングでカメラで撮影した画像を取り扱うようになると、OpenCVを使えるようにしておくと何かと便利です。OpenCVはフリーの画像処理ライブラリで、Pythonでも使用できるので、早速Raspberry Pi4にインストールしてみます。

ターミナルを起動し、以下のコマンドを実行するとOpenCVをインストールできます。

$ pip3 install opencv-python

OpenCVがインストールされたかどうかを確認するには、ターミナルに以下のコマンドを入力します。

$python3

>>> import cv2
>>> cv2.__version__

 

PythonOpenCVのバージョンがそれぞれ表示されれば問題なくインストールされています。

今回「import cv2」を実行した際に以下のエラーが出ました。

ImportError: numpy.core.multiarray failed to import

Googleで調べてみると、インストールされている「numpy」が古い事が原因の様です。

以下のコマンドで「pipのアップデート」、「numpyのアップデート」を行う事で解決しました。

$ pip3 install --upgrade pip
$ pip3 install numpy --upgrade

OpenCVが使える様になったので、テストプログラムを作成してみます。

プログラムが保存されているフォルダと同じフォルダに置かれたjpegファイルを読み込み、画面に表示するプログラムです。

#モジュールのインポート
import cv2

#jpegファイルの読み込み
img = cv2.imread("test_picture.jpg")

#画像ファイルの表示
cv2.imshow("test-output",img)
cv2.waitKey(0)

<まとめ>

Raspberry Pi4のカメラ機能のテストとして、カメラモジュールの接続 → 撮影 → 画像処理機能をテストしてみました。

 

画像処理機能は、命令文1行で撮影した画像に様々な効果を追加できるので、おもしろ画像が簡単に作成できて良いですね。

 

今後はOpenCVを使って、より高度な画像処理にもトライしてみようと思います。

それでは、また。

【ラズパイ】Raspberry Pi4でサーボモータを回してみる(SunFounder SF3218MG )

f:id:zaloha8:20220321154005j:plain

こんにちは。alohaです。

 

Raspberry Pi4で模型用のサーボモータを回すテストを行ったので、結果を書き残しておきます。

 

模型用のサーボモータは、ラジコンの舵やロボットの関節などを動かすのに使われており、以下の特徴があります。

  • 回転軸が連続回転しない(1回転以内の◯°〜◯°の範囲で動作)
  • 指定した角度まで動いた後、その角度を維持する様に振る舞う
  • モータに入力するパルス信号のデューティ比を変えると回転軸の角度も変わる

サーボモータの使い方を覚えておくと、今後の工作の際に役立ちそうです。

それでは早速、テストを開始します。

 

<必要部品(Raspberry Pi4以外に必要なもの)>

  • サーボモータ(SunFounder SF3218MG)   1個
  • DCアダプタ(5 [V], 2.3 [A])         1個
  • ジャンパー線                 数本

f:id:zaloha8:20220321151149j:plain

 

<SunFounder SF3218MGの仕様>

メーカで公表している仕様は以下の通りです。

  • ストールトルク:20.5 [kg・cm] 〜 22.8 [kg・cm]
  • 無負荷速度:0.18 [sec/60°] 〜 0.14 [sec/60°]
  • 動作電圧:4.8 [V] 〜 7.2 [V]
  • 回転角度:270 [°]
  • 不感帯幅:5 [μs]
  • 重さ:56 [g]

ただ、これだけだとモータにどの様なパルス信号を入力すれば良いか分からないため、

試行錯誤して、以下の条件でパルス信号を入力するとうまく制御できる事が分かりました。

  • 入力周波数:100 [Hz]
  • デューティ比:5 [%](回転軸角度0 [°]の時)
  • デューティ比:24.5 [%](回転軸角度270 [°]の時)

 

【デューティ比:5 [%](回転軸角度0 [°])の場合の入力信号】

f:id:zaloha8:20220321151814p:plain

 

【デューティ比:24.5 [%](回転軸角度270 [°])の場合の入力信号】

f:id:zaloha8:20220321152320j:plain

 

<回路図>

Qt-BSchで回路図を書くと、下図の様になります。

Raspberry Pi4側からは、パルス信号を出す線が1本あれば良いので回路としてはシンプルになります。

f:id:zaloha8:20220321155114j:plain

 

回路図の通りに配線し、ハードウェアとしては完成です。

f:id:zaloha8:20220321152906j:plain

 

<動作プログラム>

動作プログラムとして、回転軸の角度を0 [°]〜270 [°]まで45 [°]刻みで回転させるプログラムを作成しました。0 [°]〜270 [°]の間を計2往復します。

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#ピン番号の割当方式を「コネクタのピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
SVM=8

#8番ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(SVM,GPIO.OUT,initial=GPIO.LOW)

#SF3218MGのスペック
#周波数
freq = 100
#最小回転角度
dg_min = 0.0
#最大回転角度
dg_max = 270.0
#最小デューティ
dc_min = 5.0
#最大デューティ
dc_max = 24.5

#回転角度をデューティに変換する関数
def conv_dc(dg):
    return((((dc_max - dc_min) / (dg_max - dg_min)) * (dg - dg_min)) + dc_min)

#PWMオブジェクトのインスタンスを作成
#出力ピン:8番、周波数:100Hz
p=GPIO.PWM(SVM,freq)

#PWM信号を出力
p.start(0)


#0deg~270degまで回転
for deg in range(0,271,45):
    dc = conv_dc(float(deg))

    #現在角度とデューティを表示
    print("angle=",deg, "dyty=",dc)

    #デューティ比を設定
    p.ChangeDutyCycle(dc)
    time.sleep(2.0)

#270deg~0degまで回転
for deg in range(270,-1,-45):
    dc = conv_dc(float(deg))
    
    #現在角度とデューティを表示
    print("angle=",deg, "duty=",dc)

    #デューティ比を設定
    p.ChangeDutyCycle(dc)
    time.sleep(2.0)
        

#270degまで回転
p.ChangeDutyCycle(conv_dc(float(270)))
time.sleep(3.0)

#0degまで回転
p.ChangeDutyCycle(conv_dc(float(0)))
time.sleep(3.0)

    
#メッセージを表示
print("End of program")

#PWMを停止
p.stop()

#GPIOを開放
GPIO.cleanup()

 

<まとめ>

という訳で、Raspberry Pi4でサーボモータを回転させるテストを行いました。

サーボモータ1個につき、必要なGPIO端子が1個で済むので、多数のサーボモータを同時に制御することもできそうです。

 

応用例として、多関節ロボットの作成などにもトライしてみたいですね。

それでは、また。

【ラズバイ】Raspberry Pi4でステッピングモータを回す②(バイポーラ式 : Quimat 17HS4401)

f:id:zaloha8:20220213110654j:plain

こんにちは。alohaです。

 

Raspberry Pi4でステッピングモータを回すテストの2回目として、バイポーラ式のモータを回してみます。

 

今回制御するモータは、3Dプリンタ等で使用されているQuimat Nema 17ステッピングモータで、型式は17HS4401です。

 

バイポーラ式ステッピングモータの回路図は下の図の通りになっており、

① Black -> Green ② Blue -> Red ③ Green -> Black ④ Red -> Blue

の順に電流を流すことによりモータが回転します。

f:id:zaloha8:20220213111611j:plain

 

電流を流す向きを変えながらモータに信号を入力する必要があるため、Raspberry Pi4のGPIOだけでモータを回す事は難しそうです。

 

そこで、今回はモータドライバとして、Quimat 4A TB6600を使ってモータを回します。

また、応用例として、1軸CNCルーターも回してみます。

 

それでは、早速作ってみましょう。

 

<必要部品(Raspberry Pi4以外に必要なもの)>

  • バイポーラ式ステッピングモータ(Quimat 17HS4401)   1個
  • モータドライバ(Quimat TB6600)            1個
  • DCアダプタ(12V, 2A)                  1個
  • ブレッドボード(小)                   1個
  • ジャンパー線                       数本

いずれも、Amazonから購入可能です。

f:id:zaloha8:20220213155712j:plain

 

<回路図>

BSch3Vで回路図を書くと下の図の様になります。

f:id:zaloha8:20220213112300j:plain

Amazonの商品紹介ページに載っている配線図の通りに配線しますが、Raspberry Pi4のGPIOから出力される電圧が3.3 [V]である点に注意が必要です。

TB6600の信号入力端子は、①ENA- / ENA+ ②DIR- / DIR+ ③PUL- / PUL+ の3組がありますが、いずれも2つの信号の差があるかどうかで制御の状態を切り替えています。

(例えば、DIR-とDIR+に入力される電圧が同じであればモータは正回転し、差があればモータは逆回転します)。

このため、ENA+, DIR+, PUL+は、Raspberry Pi4のGPIOの3.3 [V]に接続する必要があります。

回路図の通りに接続すると、下の写真の様になります(モータシャフトの回転が分かりやすい様に、3Dプリンタで作成した円盤をつけています)。

f:id:zaloha8:20220213102733j:plain

 

<TB6600の設定>

TB6600のDIPスイッチで、モータ1回転に必要なパルス数とモータに流す電流の上限値を設定します。

f:id:zaloha8:20220213104017j:plain

今回は、200パルスでモータ1回転するモードに設定します。また、17HS4401のデータシートを見ると、定格電流は1.7 [A]なのでDIPスイッチは以下の設定にします。

 

S1 = ON,    S2 = ON,    S3 = OFF,    S4 = ON,    S5 = ON,    S5 = OFF

f:id:zaloha8:20220213104406j:plain

 

<動作プログラム>

動作プログラムは以下の通りです。

回転角度を指定した後、角度をパルス数に変換してGPIO端子からパルスを出力しています。

このプログラムでは、モータシャフトを時計回りに1回転、反時計回りに1回転させています。

シャフトの回転速度を変えるには、29行目の変数widを変えて出力されるパルスの幅を変更します。

 

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#ピン番号の割当方式を「コネクタのピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
PUL=8
DIR=10
ENA=12

#8,10,12番ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(PUL,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(DIR,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(ENA,GPIO.OUT,initial=GPIO.LOW)

#DIR=HIGHで時計回り、DIR=LOWで半時計回り。
#ENA=HIGHでトルク発生、ENA=LOWではトルクが発生しない。

DIR_ST = 1
ENA_ST = 1

#パルスの幅を指定。値を小さくする程高速で回転する。
wid = 0.005

#回転角度を指定
ang = 360

#減速比を設定
#1軸CNCルータの場合は4を設定
#モータ単体の場合は1を設定
ratio = 1

#回転角度をパルス数に換算
cnt = int(ratio*(ang / (360/200)))

for i in range(0,2):
    
    for j in range(0,cnt):    

        GPIO.output(ENA,ENA_ST)
        GPIO.output(DIR,DIR_ST)
        
        GPIO.output(PUL,0)
        time.sleep(wid)
        GPIO.output(PUL,1)
        time.sleep(wid)
    
    time.sleep(2.0)
    
    if(i % 2 == 0):
        DIR_ST = 0
    else:
        DIR_ST = 1


#メッセージを表示
print("End of program")

#GPIOを開放
GPIO.cleanup()

 

<応用例:1軸CNCルータを動かす>

Raspberry Pi4でバイポーラ式ステッピングモータを制御できるようになると、1軸CNCルータも動かせる様になります。1軸CNCルータとは写真の様な物で、ステッピングモータと円筒状の物をつかむチャックがセットになった物です。Amazonで偶然見つけて購入した物ですが、もともとは中国製の3軸CNCフライス盤に4軸目を追加する目的で作られた物の様です。

f:id:zaloha8:20220213104932j:plain

f:id:zaloha8:20220213105253j:plain

モータの回転軸とチャックの回転軸をベルトで繋ぎ、モータの駆動力を伝える構造になっています。ベルトで動力を伝える際にモータの回転角度が1/4に減速されるため、チャックを指定角度回転させるためには、プログラムの方でパルス数を4倍にする必要があります。

(プログラムの37行目で減速比を指定)

 

<まとめ>

今回は、Raspberry Pi4でバイポーラ式ステッピングモータを回すテストを行いました。応用例として1軸CNCルータの動作も確認しました。

 

ステッピングモータ等の3Dプリンタ用の部品もAmazonで簡単に購入できる様になっています。個人の物づくりもしやすくなっているので、どんどん活用していきたいですね。

 

それでは、また。

【ラズバイ】Raspberry Pi4でステッピングモータを回す①(ユニポーラ式:28BYJ-48)

f:id:zaloha8:20220109174722j:plain

こんにちは。alohaです。

 

Raspberry Pi4でステッピングモータを回すテストを行ったので、結果を書き残しておきます。

 

ステッピングモータの特徴として、

          ・角度の制御が可能

          ・連続回転が可能

という特徴があり、様々な用途で使用されています。

 

ステッピングモータには、ユニポーラ方式とバイポーラ方式がありますが、今回テストを行ったのはユニポーラ方式です。

 

<必要部品(Raspberry Pi4本体以外に必要なもの)>

  • 28BYJ-48 ULN2003ドライバーボードセット   1セット
  • ACアダプタ(DC5V, 2.3A)           1個
  • ジャンパー線                   数本

f:id:zaloha8:20220109172410j:plain

 

<ユニポーラ式ステッピングモータ>

今回テストするユニポーラ式ステッピングモータ(28BYJ-48)の回路図は下の図の通りです。2つあるREDの線は1本にまとまっているため、信号線としては5本あります。

f:id:zaloha8:20220109091628j:plain

 

REDの線がGNDで他の4本の信号線(PINK, ORANGE, YELLOW, BLUE)からパターンの決まった電圧信号を入力する事でモータを回転させる事ができます。

 

<電圧信号の入力パターン>

電圧信号の入力パターンは、1相励磁、2相励磁、1-2相励磁等があり、入力パターンはそれぞれ以下の通りです。

 

① 1相励磁(最も単純な方式)

f:id:zaloha8:20220109131652j:plain

② 2相励磁(滑らかに動作)

f:id:zaloha8:20220109131152j:plain

 

③ 1-2相励磁(さらに滑らかに動作します)

f:id:zaloha8:20220109132926j:plain

 

<正回転、逆回転の切替え>

ステッピングモータの正回転、逆回転を切換えるには、例えば1相励磁の場合は下の図の様な電圧入力パターンにします。

f:id:zaloha8:20220109135926j:plain

 

<回転速度の切替え>

ステッピングモータの回転速度を変更するには、例えば1相励磁の場合は下の図の様に入力電圧の幅を変更します。

入力電圧の幅を狭くするとモータは高速で回り、広くすると低速で回りますが、設定できる幅には限界があり、限界値以下の(もしくは以上の)幅を設定するとモータは回らなくなります。

f:id:zaloha8:20220109142453j:plain



<回路図>

Raspberry Pi4でステッピングモータ(28BYJ-48)を回す場合の回路図は下の図の通りです。

f:id:zaloha8:20220109143607j:plain

組み立てると下の写真の様になります。

シャフトの回転角度を分かりやすくするため、3Dプリンタで作成した▲印付きの円盤を付けています。

f:id:zaloha8:20220109172820j:plain

 

<動作プログラム>

ステッピングモータ(28BYJ-48)を回すPythonプログラムとして、

正回転(反時計回り1周)→ 逆回転(時計回り1周)を行うプログラムを作成しました。

 

モータの仕様では、64パルスでモータのシャフトが5.625°回転する仕様ですが、これは1-2相励磁の場合です。1相励磁、2相励磁の場合は 半分の32パルスでモータのシャフトが5.625°回転します。

 

モータのシャフトを1回転(360°)させる場合、Raspberry Pi4側から出力するパルス数は以下の式で計算できます。

 

【1相励磁、2相励磁の場合】

パルス数=\frac{360}{(5.625/32)}=2048

【1-2相励磁の場合】

パルス数=\frac{360}{(5.625/64)}=4096

 

 

・1相励磁 or 2相励磁でステッピングモータを回すプログラム

(29, 30行目で1相励磁 or 2相励磁のどちらかを選択します)

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#collectionsライブラリのdequeオブジェクトをインポート
from collections import deque

#ピン番号の割当方式を「コネクタピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
IN_1=8    #BLUE
IN_2=10   #PINK
IN_3=16   #YELLOW
IN_4=18   #ORANGE

#各ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(IN_1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_4,GPIO.OUT,initial=GPIO.LOW)

#出力信号パターンのリストを作成
#(1相励磁 or 2相励磁どちらかを選択)
#sig = deque([0,1,0,0])        #1相励磁
sig = deque([1,1,0,0])       #2相励磁

#回転させる角度をdegで入力
ang = 360

#角度degをパルス数に換算
p_cnt = int(ang / (5.625 / 32))

#回転方向を定義(-1が時計回り、1が反時計回り)
dir = 1

#パルス幅を変数に入力
#値が小さい程回転速度は上がる。0.002より小さい値にすると回転しない
p_wid = 0.002


#時計回りに1回転、反時計回りに1回転する
for i in range(0,2):
    #パルス出力開始
    for j in range(0,p_cnt):
        
        #出力信号パターンを出力
        GPIO.output(IN_1, sig[0])
        GPIO.output(IN_2, sig[1])
        GPIO.output(IN_3, sig[2])
        GPIO.output(IN_4, sig[3])
        
        #パスル幅分待機
        time.sleep(p_wid)
        
        #出力信号パターンをローテート
        sig.rotate(dir)
    #回転方向を逆向きにする
    dir = dir * -1
    #1秒待機
    time.sleep(1.0)
    #カウントアップ
    i += 1


#メッセージを表示
print("End of program")
    

#GPIOを開放
GPIO.cleanup()

 

 

・1-2相励磁でステッピングモータを回すプログラム

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#collectionsライブラリのdequeオブジェクトをインポート
from collections import deque

#ピン番号の割当方式を「コネクタピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
IN_1=8    #BLUE
IN_2=10   #PINK
IN_3=16   #YELLOW
IN_4=18   #ORANGE

#各ピンを出力ピンに設定し、初期出力をローレベルにする
GPIO.setup(IN_1,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_2,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_3,GPIO.OUT,initial=GPIO.LOW)
GPIO.setup(IN_4,GPIO.OUT,initial=GPIO.LOW)

#出力信号パターンのリストを作成
sig_1 = deque([0,1,0,0])       #1相励磁
sig_2 = deque([1,1,0,0])       #2相励磁

#回転させる角度をdegで入力
ang = 360

#角度degをパルス数に換算
p_cnt = int(ang / (5.625 / 64))

#回転方向を定義(-1が時計回り、1が反時計回り)
dir = 1

#パルス幅を変数に入力
#値が小さい程回転速度は上がる。0.001より小さい値にすると回転しない
p_wid = 0.001


#時計回りに1回転、反時計回りに1回転する
for i in range(0,2):
    #パルス出力開始
    for j in range(0,p_cnt):
        
        if(j % 2 == 0):
            #出力信号パターンを出力
            GPIO.output(IN_1, sig_2[0])
            GPIO.output(IN_2, sig_2[1])
            GPIO.output(IN_3, sig_2[2])
            GPIO.output(IN_4, sig_2[3])
                        
            #パスル幅分待機
            time.sleep(p_wid)
            
            #出力信号パターンをローテート
            sig_2.rotate(dir)
        else:
            #出力信号パターンを出力
            GPIO.output(IN_1, sig_1[0])
            GPIO.output(IN_2, sig_1[1])
            GPIO.output(IN_3, sig_1[2])
            GPIO.output(IN_4, sig_1[3])
                        
            #パスル幅分待機
            time.sleep(p_wid)
            
            #出力信号パターンをローテート
            sig_1.rotate(dir)
            
            
    #回転方向を逆向きにする
    dir = dir * -1
    #1秒待機
    time.sleep(1.0)
    #カウントアップ
    i += 1


#メッセージを表示
print("End of program")
    

#GPIOを開放
GPIO.cleanup()

 

<まとめ>

Raspberry Pi4でステッピングモータ(28BYJ-48)を回すテストを行いました。

単純にモータを回すだけでも電圧信号のパターンについて学ぶ事が多く、とても勉強になります。

電圧信号のパターンの図を眺めるだけではなく、実際にプログラムを作成して動かして見るとより一層理解が深まりますね。

モータを使った物づくりに役立ちそうです。

 

それでは、また。

【備忘録】iPadのTextasticでコンソール出力する2つの方法

f:id:zaloha8:20220104100509j:plain

こんにちは。alohaです。

 

iPadがキーボードとマウスに対応したことにより、iPadでプログラミングを行う事もできるようになりました。

 

私の場合、自宅でプログラミングする場合はMacBookを使用し、外出先でプログラミングする場合はiPadを使用しています。

 

最近では、iPadにプログラミングの開発環境を構築するのも簡単にできるようになっており、

Pythonの開発環境として『Pythonista』を、HTML, CSS, JavaScriptの開発環境として『Textastic』をiPadに入れています。どちらのアプリもiCloudドライブを経由してファイルを共有できる点も良いですね。

 

さて、先日『Textastic』を使ってJavaScriptの勉強をしていて、iPadSafariでプレビューするとコンソール出力の結果が見れない事に気がつきました。

 

JavaScriptでコードを書いていると、どうしてもコンソールに値を出力して処理の結果を確認したい場面が出てくるので、コンソール出力の結果が見れないと不便です。

 

いろいろ調べて、コンソール出力する方法を2つ試した結果を書き残しておきます。

方法としては、2つあります。

 

①  Textasticのプレビュー画面で確認する方法

②  Safari拡張機能として、Web Inspectorを追加する方法

 

****.htmlには、以下のJavaScriptのコードを記載しておきます。

<script>
	console.log("test printing on console");
	console.log(Math.PI);
	console.log("日本語も出力できます");
</script>

 

①  Textasticのプレビュー画面で確認する方法

以下のページによると、Textasticの6.3からコンソールが追加されたとの事。

 

https://feedback.textasticapp.com/en/communities/1/topics/921-javascript-debug-console

 

探してみると、以下の通りconsole.log()で出力した内容が見れました。

 

・画面右上のプレビューボタン(メガネのマーク)をクリックします。

f:id:zaloha8:20220104090838j:plain

 

・画面左上のボタンをクリックするとconsole.log()で出力した内容が見れます。

f:id:zaloha8:20220104091350j:plain

 

②  Safari拡張機能として、Web Inspectorを追加する方法

iPad OS 15より、Safariの機能拡張としてWeb Inspectorを追加すると、コンソール出力した内容を見れる様になっています。

 

・『設定』→『Safari』→『機能拡張』→『機能拡張を追加』の順にクリックします。

f:id:zaloha8:20220104092001j:plain

 

App Storeに接続されるので、Web Inspectorアプリを入れます。

f:id:zaloha8:20220104092411j:plain

 

・『設定』→『Safari』→『機能拡張』の画面に『Web Inspector』が追加されているので、クリックしてONにします。

f:id:zaloha8:20220104092858j:plainf:id:zaloha8:20220104093456j:plain

 

・Textasticから『Preview in Safari』をクリックします。

f:id:zaloha8:20220104094152j:plain



Safariのアドレスバーの右側に追加されたアイコンをクリックし、『Web Inspector』をクリックします。

f:id:zaloha8:20220104094616j:plain

 

開発者用画面が表示されるので、『Console』タブをクリックすると、console.log()で出力した内容が表示されています。

f:id:zaloha8:20220104094913j:plain

 

<まとめ>

iPadのTextasticでコンソールに出力する方法を2つ試しました。

どちらの方法でもconsole.log()で出力した内容を見ることができるので、好きな方を使うのが良いと思います。

 

これでiPadを使ったプログラミングが効率よく進められますね。

それでは、また。

【ラズパイ】Raspberry Pi4をモバイル化する2つの方法

f:id:zaloha8:20211230090540j:plain

こんにちは、alohaです。

 

Raspberry Pi4をモバイル化する方法を2つ試したので、結果を書き残しておきます。

方法としては、以下の2つがあります。

 

① 小型モニタとモバイルバッテリー、ワイヤレスキーボード、マウスを使う方法

② モバイルバッテリーとリモート接続を使う方法

 

<経緯>

Raspberry Pi4を使った物づくりをしていて、以前モータドライバを使った2輪駆動車を作りました。

テストとしてはOKでしたが、有線で動かしていると出来ることも限られてしまうため、Raspberry Pi4をワイヤレスで動かす方法を試す事にしました。

 

creators-small-room.hatenablog.com

 

<現状の構成>

Raspberry Pi4を動かしている現状の構成は下の図の通りです。

ほとんどのユーザがこの構成で使用していると思います。

f:id:zaloha8:20211226114337j:plain

Raspberry Pi4をモバイル化するためには、有線で接続された以下の3ヶ所の対応が必要です。

 

  • 100 [V]電源の接続部分
  • モニタ接続部分
  • キーボード、マウスの接続部分

 

<小型モニタとモバイルバッテリー、ワイヤレスキーボード、マウスを使う方法>

小型モニタ

Raspberry Pi4に対応した小型モニタは多数販売されており、Amazonから購入可能です。

今回は、Raspberry Pi4本体とほぼ同じ大きさの3.5インチモニタを購入しました。

タッチペンが付属しており、ドライバをインストールすれば、Raspberry Pi4をタッチパッドで使用できます。

f:id:zaloha8:20211226143557j:plain

ELECROW 3.5インチ モバイルモニター Raspberry Pi用    ¥3,699

 

モバイルバッテリー

モバイルバッテリーは、Raspberry Pi4の動作実績のあるものをGoogleで調べてこちらを購入しました。家庭用100 [V]コンセントで充電後、コンセントから外してモバイルバッテリーとして使用できます。

f:id:zaloha8:20211226144457j:plain

Anker PowerCore Fusion 5000    ¥2,990

 

ワイヤレスキーボード、マウス

ワイヤレスキーボード、マウスはシンプルで使いやすそうなこちらを購入。

幸いにもBluetoothでペアリングするだけで使用することができましたが、反応が鈍いので作業していると少しストレスを感じます。

f:id:zaloha8:20211226145517j:plain

Ewin キーボード ワイヤレス マウスセット bluetooth JIS日本語配列    ¥2,980

小型モニタ、モバイルバッテリー、キーボード、マウスを接続すると下の写真の様になります。モニタの接続にGPIO端子を使っているため、GPIO端子を他の用途に使う場合は注意が必要です。

f:id:zaloha8:20211226150102j:plain

 

これだけでも普通に使えますが、タッチペンに対応するためにはターミナルを起動して書き込み可能な任意のフォルダ移動し、以下のコマンドを実行してドライバをインストールします。

 

sudo rm -rf LCD-show
git clone https://github.com/goodtft/LCD-show.git
chmod -R 755 LCD-show
cd LCD-show/
sudo ./MPI3508-show

 

2つ目のコマンドでフォルダ上にLCD-showという名前のフォルダが作成され、中にドライバ類がコピーされます。

5つ目のコマンドでドライバがインストールされます。

  • MPI3508-showを実行するとタッチペンに対応します。ただし普通のモニタは映らなくなります。
  • 元に戻すには、LCD-hdmiを実行します。

タッチペンに対応したモードでは、マウスの「左クリック」、「左クリックしたままのドラッグ」に相当する操作が可能です。

 

<モバイルバッテリーとリモート接続を使う方法>

小型モニタを使う方法だとRaspberry Pi4のGPIO端子を使ってしまうため、GPIO端子を他の用途に使いたい場合には、リモート接続で使う方が良いです。

リモート接続する場合は、Raspberry Pi4が電源に接続されて起動していれば良く、モニタやキーボード、マウスを接続する必要はありません。

 

Raspberry Pi4本体の設定

デスクトップの「メニュー」 → 「設定」 → 「Raspberry Piの設定」から設定画面を開きます。

 

インターフェイス」タブの「VNC」を有効にして、OKボタンをクリックします。

f:id:zaloha8:20211226155123j:plain

パネルのVNCアイコンをクリックし、表示された画面のIPアドレスをメモします。

f:id:zaloha8:20211226164826j:plain

 

リモート接続するデバイス側の設定(Macbookの場合)

VNC Viewerをダウンロード、インストールします。

 

インストールしたVNC Viewerを起動し、Raspberry Pi4のIPアドレスを入力後、エンターキーを押します。

f:id:zaloha8:20211226210217j:plain

 

Raspberry Pi4のユーザ名(pi)とパスワードを入力し、OKボタンを押すと接続できます。

f:id:zaloha8:20211228205556j:plain

f:id:zaloha8:20211228210025j:plain

 

リモート接続するデバイス側の設定(iPadの場合)

VNC ViewerはiPad用のアプリもあるため、iPadからRaspberry Pi4を操作することもできます。

 

App Storeから、VNC Viewerをダウンロード、インストールします。

 

アプリを起動して右上の「+」ボタンをタップします。

f:id:zaloha8:20211229095123j:plain

 

出てきた画面にRaspberry Pi4のIPアドレスと名称を入力して「Save」ボタンをタップします(名称は適当でOKです)。

次の画面で「Done」をタップするとVNC Viewerの初期画面に戻ります。

f:id:zaloha8:20211229100829j:plainf:id:zaloha8:20211229102053j:plain

 

VNC Viewerの初期画面に戻り、接続するRaspberry Pi4をタップして、ユーザ名(pi)とパスワードを入力し、「Continue」をタップすると接続できます。

f:id:zaloha8:20211229103615j:plain

f:id:zaloha8:20211229110317j:plain

接続できました。

f:id:zaloha8:20211229110549j:plain

 

iPadからのリモート接続では、画面を見る分には問題ありませんが、キーボードとマウスの操作性が良くないのであまりおすすめしません。

 

<まとめ>

という訳で、Raspberry Pi4をモバイル化する方法として、2つの方法を試しました、

 

① 小型モニタとモバイルバッテリー、ワイヤレスキーボード、マウスを使う方法

② モバイルバッテリーとリモート接続を使う方法

 

GPIO端子を使う都合や、操作性を考えるとPCからリモート接続して使うのが良さそうです。

Raspberry Pi4をモバイル化したい場合や、ロボットカーを作る場合に役立ちます。

良ければ参考にしてください。

 

それでは、また。

【ラズパイ】Raspberry pi4とモータドライバ(TB6612FNG)で2輪駆動車を作る。

f:id:zaloha8:20211128110911j:plain

こんにちは。alohaです。

 

Raspberry pi4でモータを回せる様になると、作れる物の幅が広がって色々な物が作れる様になります。

 

前回は、トランジスタを使ったマブチモータの回転にトライしましたが、この方法だとモータを回すことはできても、正回転、逆回転の切替えはできませんでした。

 

creators-small-room.hatenablog.com

 

今回は、モータドライバICとしてTB6612FNGを使用して、モータ2個の正回転、逆回転を試します。

 

また、応用例として、モータ2個の回転をコントロールし、独立した2個の車輪を回して走行する2輪駆動車を作成します。

 

それでは、早速作ってみましょう。

 

<部品一覧 (Raspberry pi4以外に必要な部品)>

  • モータドライバIC(TB6612FNG)              1 個
  • 抵抗(4.7 [Ω])                       2 個
  • TAMIYA 楽しい工作シリーズ NO.168 ダブルギヤボックス    1 個
  • TAMIYA 楽しい工作シリーズ ナロータイヤセット        1 個
  • TAMIYA 楽しい工作シリーズ NO.144 ボールキャスタ      1 個
  • バッテリボックス (3.0 [V]用)                 1 個
  • ブレッドボード                      1 個
  • 配線用ワイヤ                       数本

f:id:zaloha8:20211128095209j:plainf:id:zaloha8:20211122110040j:plain

f:id:zaloha8:20211122110640j:plainf:id:zaloha8:20211122111232j:plain

 

<回路図>

Qt-BSchで回路図を書くと下図の様になります。

f:id:zaloha8:20211128173400j:plain

 

① モータドライバIC(TB6612FNG)

モータドライバIC(TB6612FNG)は、電源電圧3.0 [V]で動作可能で、モータ2個を動かせる小型モータドライバICとしてお馴染みです。モータ1個につき4つの信号線(IN1, IN2, PWM, STBY)を使ってRaspberry pi4側から信号を出力すると、モータの正回転、逆回転、速度制御を行う事ができます。

モータドライバICが載ったプリント板とピンヘッダが分かれた状態で送られて来るので、半田付けしてブレッドボードで使える様にする必要があります。

f:id:zaloha8:20211128095855j:plain

 

データシートから、Raspberry pi4側から出力する信号パターンは以下の通りです。

f:id:zaloha8:20211122105321j:plain



② TAMIYA ダブルギヤボックスとタイヤセット

TAMIYAのダブルギヤボックスは、モータ2個とモータ回転を減速するギヤボックスがセットになった工作用のキットで、ギヤボックスの出力シャフトを左右独立して回す事ができるので、2輪駆動車を作るのに向いています。左右の出力シャフトにタイヤを取り付けて、左タイヤと右タイヤの回転をそれぞれコントロールすれば、2輪駆動車を前進、後進、右回転、左回転させる事ができます。

f:id:zaloha8:20211122110040j:plainf:id:zaloha8:20211122110640j:plain

 

③ 電流制限抵抗

ダブルギヤボックスキットに付属のモータはFA-130で、データシートによると定格電流はIm=0.66 [A]、電源電圧はVcc=3.0 [V]なので、電流制限抵抗R1, R2は以下の通りになります。

 

R1=\frac{Vcc}{Im}=\frac{3.0}{0.66}=4.5 \left[\Omega\right]

 

今回は、手持ちの抵抗から4.7 [Ω]を採用します。

 

ブレッドボード上に配線すると、下の写真の様になります。

f:id:zaloha8:20211128100839j:plain

 

ダブルギヤボックスとタイヤの2輪だけだと車としてバランスが悪いので、3Dプリンタでベースプレートを作成し、ダブルギヤボックスとタイヤ、ボールキャスタを付ければ、ハードウェアとしては完成です。

f:id:zaloha8:20211122111232j:plain

f:id:zaloha8:20211128102443j:plainf:id:zaloha8:20211128102648j:plain

 

<動作プログラム>

動作プログラムは、下記の通りです。

プログラムを実行すると、2輪車が『前進 → 右回転 → 左回転 → 右回転 → 後進』します。

 

#coding:utf-8

#GPIOライブラリをインポート
import RPi.GPIO as GPIO

#timeライブラリをインポート
import time

#ピン番号の割り当て方式を「コネクタのピン番号」に設定
GPIO.setmode(GPIO.BOARD)

#使用するピン番号を代入
AIN1 = 8
AIN2 = 10
PWMA = 12

BIN1 = 22
BIN2 = 24
PWMB = 26

#各ピンを出力ピンに設定
GPIO.setup(AIN1, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(AIN2, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(PWMA, GPIO.OUT, initial = GPIO.LOW)

GPIO.setup(BIN1, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(BIN2, GPIO.OUT, initial = GPIO.LOW)
GPIO.setup(PWMB, GPIO.OUT, initial = GPIO.LOW)

#PWMオブジェクトのインスタンスを作成
#出力ピン:12,26  周波数:100Hz
p_a = GPIO.PWM(PWMA,100)
p_b = GPIO.PWM(PWMB,100)

#PWM信号を出力
p_a.start(0)
p_b.start(0)

#デューティを設定(0~100の範囲で指定)
#速度は80%で走行する。
val = 80

#デューティ比を設定
p_a.ChangeDutyCycle(val)
p_b.ChangeDutyCycle(val)

#ブレーキする関数
def func_brake():
    GPIO.output(AIN1, GPIO.HIGH)
    GPIO.output(AIN2, GPIO.HIGH)
    GPIO.output(BIN1, GPIO.HIGH)
    GPIO.output(BIN2, GPIO.HIGH)


#前進する関数
def func_forward():
    GPIO.output(AIN1, GPIO.LOW)
    GPIO.output(AIN2, GPIO.HIGH)
    GPIO.output(BIN1, GPIO.LOW)
    GPIO.output(BIN2, GPIO.HIGH)


#後進する関数
def func_back():
    GPIO.output(AIN1, GPIO.HIGH)
    GPIO.output(AIN2, GPIO.LOW)
    GPIO.output(BIN1, GPIO.HIGH)
    GPIO.output(BIN2, GPIO.LOW)


#右回転する関数
def func_right():
    GPIO.output(AIN1, GPIO.LOW)
    GPIO.output(AIN2, GPIO.HIGH)
    GPIO.output(BIN1, GPIO.HIGH)
    GPIO.output(BIN2, GPIO.LOW)


#左回転する関数
def func_left():
    GPIO.output(AIN1, GPIO.HIGH)
    GPIO.output(AIN2, GPIO.LOW)
    GPIO.output(BIN1, GPIO.LOW)
    GPIO.output(BIN2, GPIO.HIGH)


#メインプログラム
while True:
        
    #3秒前進する
    func_forward()
    time.sleep(3.0)        
    #3秒ブレーキ
    func_brake()
    time.sleep(3.0)
    
    
    #1.5秒右回転する
    func_right()
    time.sleep(1.5)
    #3秒ブレーキ
    func_brake()
    time.sleep(3.0)
    

    #2.8秒左回転する
    func_left()
    time.sleep(2.8)
    #3秒ブレーキ
    func_brake()
    time.sleep(3.0)


    #1.5秒右回転する
    func_right()
    time.sleep(1.5)
    #3秒ブレーキ
    func_brake()
    time.sleep(3.0) 


    #3秒後進する
    func_back()
    time.sleep(3.0)
    #3秒ブレーキ
    func_brake()
    time.sleep(3.0)
    
    break
    

#PWM信号を停止
p_a.stop()
p_b.stop()

#GPIOを開放
GPIO.cleanup()

#プログラム終了
print("End of program")

 

今回のプログラムでは、左右のモータのデューティ比を共通にしましたが、前進、後進の際に左右のモータの回転速度に少し差があり、2輪車がまっすぐに進まないという問題も見つかりました。テストとしてはOKだと思いますが、左右のモータのデューティ比を別々に設定したり、モータをステッピングモータに変更する等で改善できそうなので、試してみたいと思います。

 

<まとめ>

という訳で、Raspberry pi4とモータドライバ(TB6612FNG)で2輪駆動車を作ってみました。

モータドライバのテストとしてはOKですが、問題もいろいろ見つかったので、今後改善していきたいと思います。

 

まずは、2輪車を有線で動かしていると動ける範囲が制限されて大したことはできないので、この部分から改善していきます。

 

それでは、また。