はじめに
以前のブログでは、Raspberry Pi Picoを使って赤外線センサーの状態を取得するプログラムを作成してみました。このブログでは、その赤外線センサーの状態によってサーボモータを制御してみようと思います。
ミニブレッドボード 170穴 35mm × 47mm はんだレス BREADBOARD レッド ホワイト ブラック イエロー グリーン パープル 2点セット 価格:624円 |
ジャンパーワイヤー 3本セット 10cm Emith ジャンパー線 Arduino Raspberry pi 用 ブレッドボード ジャンパーケーブル オス メス 価格:1,495円 |
Raspberry Pi Picoの開発環境の構築とプロジェクトの作成、実行の仕方については、下記のブログ記事にまとめていますので、そちらをご覧ください。それでは、はじめていきます。
回路図
回路には、押しボタンスイッチと抵抗が付いていますが、今回は使用しません。
サーボモータは、GND(黒色線)、PWM信号線(黄色線)、電源線(赤色線)の3線からなります。
赤外線センサーは、VCC(赤色線)、GND(黒色線)、OUT(白色線)の3線からなります。
外部電源として、単三電池3本(4.5V)をRaspberry Pi Picoに接続するようにします。
パーツ | 信号 | 線色 | 接続先ピン番号 | 接続先名 |
サーボモータ SG90 | 電源 | 赤 | 36 | 3V3(OUT) |
サーボモータ SG90 | PWM | 黄 | 4 | GP2 |
サーボモータ SG90 | GND | 黒 | 3 | GND |
赤外線センサー KKHMF | VCC | 赤 | 36 | 3V3(OUT) |
赤外線センサー KKHMF | OUT | 白 | 12 | GP6 |
赤外線センサー KKHMF | GND | 黒 | 8 | GND |
外部電源 | PWR | 赤 | 39 | VSYS |
外部電源 | GND | 黒 | 38 | GND |
接続ピンは上の表のようにします。
サーボモータのPWM信号線と赤外線センサーのOUT線は、任意のGPIOになります。
ここでは、GP2とGP6を使用してプログラムを作成していきます。
プロジェクトのディレクトリ作成
作成するプロジェクトのディレクトリをつくります。
環境構築の部分で、pico-sdkが作成されているとして、次のようなディレクトリ構成とします。
robothandディレクトリ内にrobothand.cファイルを作成して、このファイルにプログラムを書いていきます。
C:¥prog¥pico¥DL
┗¥pico-sdk
┗¥robothand
┗¥build
┗robothand.c
┗CMakeLists.txt
┗pico_sdk_import.cmake
pico-sdkの作成方法については、開発環境作成のブログにまとめていますのでこちらを参照してください。
SourceファイルとMakeファイルの作成
まず、ソースファイルとビルドファイルを準備します。
作成したプロジェクトディレクトリに移動します。(ここでは、robothandディレクトリ)
robothandディレクトリの中に実行するソースファイルrobothand.cを作成します。
robothand.cには、次のようなコードを記述します。
センサーの状態は、状態遷移設計でセンサーのステータス管理をしています。
設計は次のような状態遷移表を作成してプログラムにしています。
センサーのON/OFFでサーボモータを0deg/-70degの位置に動かしています。
このプログラムは、サーボモータにロボットハンドグリッパーを付けて、センサーの状態によってグリッパーがOPEN/CLOSE動作するように作っています。
このセンサーは、検知状態で信号はLow、未検知状態で信号がHighになることに注意が必要です。
続いて、robothandディレクトリの中にCMakeLists.txtを作成します。
CMakeLists.txtには次のように記述しておきます。
cmake_minimum_required(VERSION 3.13)
include(pico_sdk_import.cmake)
project(robothand_project C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
pico_sdk_init()
add_executable(robothand
robothand.c
)
# pull in common dependencies and additional pwm hardware support
target_link_libraries(robothand pico_stdlib hardware_pwm)
pico_enable_stdio_usb(robothand 1)
pico_enable_stdio_uart(robothand 1)
pico_add_extra_outputs(robothand)
target_link_libraries(robothand pico_stdlib)
さらに、pico-sdk¥externalディレクトリの中にあるpico_sdk_import.cmakeというファイルをコピーして保存します。
ビルド
プロジェクトディレクトリrobothandにbuildディレクトリを作成し、カレントディレクトリとします。そこで、パス設定をしていなければ、次のコマンドを実行します。
C:\prog\pico\DL\robothand\build>setx PICO_SDK_PATH "..\..\pico-sdk"
実行ファイルを生成するため、cmakeを実行します。
C:\prog\pico\DL\robothand\build>cmake -G "NMake Makefiles" ..
C:\prog\pico\DL\robothand\build>nmake
nmakeを実行するとビルドが開始され、正常に終了するとbuildディレクトリの中にrobothand.uf2という実行ファイルが作成されます。
このファイルをRaspberry Pi Picoに書き込むことで、作成したプログラムが実行されます。
実行
nmake実行後、buildディレクトリを確認するとrobothand.uf2ファイルが生成されています。
このファイルをターゲットボードに書き込みます。
Raspberry Pi Picoのリセットボタン(ボード上の白色のボタン)を押しながらRaspberry Pi PicoにつないだUSBケーブルをPCに接続します。
この環境では、DドライブとしてRPI-RP2が認識されたので、このDドライブ内にrobothand.uf2ファイルをドラッグアンドドロップで入れ込みます。これで、書き込みは終了です。
書き込みが終わった時点で、プログラムが実行されます。
赤外線センサーが遮光されていない状態で、モータは0[deg]の位置となりグリッパーがオープンとなります。センサーが障害物を検知するとモータは-70[deg]の位置になりグリッパーが閉じます。
まとめ
いかかでしたでしょうか。このブログでは、赤外線センサーとサーボモータをRaspberry Pi Picoに接続して、センサーの状態からサーボモータを制御するプログラムを作成しました。
センサーの検知状態、未検知状態がそれぞれ信号のHighなのかLowなのかを確認しておかないと逆の動作になってしまいますので注意が必要です。
センサーとモータ動作を組み合わせることで動きを制御することができます。
サーボモータSG90と赤外線センサーKKHMFでいろいろなものづくりが楽しめそうです。
コメント