マイクロマウスをROS2で動かす。:デバイスドライバーをインストール

参考URL:https://rt-net.jp/mobility/archives/12922
ラズパイマウスにデバイスドライバをインストールして、LEDを点灯させたりモータを回したりします。

前回はラズパイマウスに搭載したRaspberry Pi 4 Model BにUbuntu 18.04をインストールしました。
またネットワークを設定しWi-Fiに接続できるようになりました。IPアドレスも固定しています。 ubuntu@192.168.1.130

今回からSSHでログインして作業していきます。

【インストール前の準備】
  $ sudo apt update
  $ sudo apt upgrade

次にボーレートの設定を変更します。
次のコマンドを入力してファイルを開き、dtparam=i2c_baudrate=62500の1文を追記します。

  $ sudo nano /boot/firmware/config.txt
下記の黄色い部分を追加「 dtparam=i2c_baudrate=62500 」


再起動後、SSHでログインします。

次のコマンドを入力して、ボーレートが 62500 になったことを確認します。

$ printf "%d\n" 0x$(xxd -ps /sys/class/i2c-adapter/i2c-1/of_node/clock-frequency)

成功です。

【 デバイスドライバをインストールする 】
 $ cd ~
 $ git clone https://github.com/rt-net/RaspberryPiMouse.git

RaspberryPiMouseというディレクトリが作成されます。そのディレクトリへ移動します。
 $cd RaspberryPiMouse/

さて、今回使用しているのはRaspberry Pi 4です。
Raspberry Pi 4を使用する場合は、ソースファイルを少し編集します。

次のコマンドでソースファイルを編集します。

 $ nano src/drivers/rtmouse.c
54行目辺りに#define RASPBERRYPI 2と書かれた行があるので、その数字を4に書き換えます。

保存終了後

 $ cd utils
で「 utils 」ディレクトリ移動して

 $ sudo apt install linux-headers-$(uname -r) build-essential
デバイスファイル生成に必要なパッケージをインストールします。

 $ ./build_install.bash
を実行したらビルドとインストールが完了です。
完了後、ブザーがピとなります。


【 サンプルプログラムを実行する 】
デバイスドライバをインストールしたので、モーターやLEDを動かせるようになります。
サンプルプログラムを実行して確認します。
まず、サンプルプログラムのディレクトリに移動します。

 $ cd ~/RaspberryPiMouse/SampleProgram
下記のようにプログラムを実行します。

【 LEDを点灯する 】
  $ bash step1.sh

Mouseロボットの前方4個の赤LEDが点滅します。端末上では「1」、「0」が表示され同期してLEDが点灯、消灯します。


【 ブザーを鳴らす 】
キーボードの「0」で音が消え、その他英文字で少し音階が変わります。

  $ bash step2.sh



【 スイッチを押す 】
 $ bash step3.sh


【 モーターを回す 】
 $ bash step4.sh


【 ライトセンサの値を読取る 】
 $ bash step5.sh


【 パルスカウンタの値を読取る 】
 $ bash step6.sh
 /dev/ 内には、「rtconunter_*」は存在しない。モーターは回転するが数値表示せずにファイルが存在しないというエラーメッセージがでる。




次のようにstep6.shを編集することで、符号付きのカウント値を読み取ることができます。
 MOTOR_R=/dev/rtmotor_raw_r0
 MOTOR_L=/dev/rtmotor_raw_l0
 COUNTER_R=/dev/rtcounter_r1   # r0からr1に書き換え
 COUNTER_L=/dev/rtcounter_l1    # l0からl1に書き換え

 /dev/ 内には、「rtconunter_*」は存在しない。モーターは回転するが数値表示せずにファイルが存在しないというエラーメッセージ



【 次回起動時も自動でデバイスドライバをインストールする 】
これまでの手順でデバイスドライバのインストールは完了しました。しかし再起動後はもう一度ドライバを読み込まないと動きません。
自動で読み込む方法はいくつかあると思いますが、今回は.bashrcを編集して、起動後(ログイン後)にデバイスドライバを読み込むようにします。
次のコマンドで.bashrcを開き、ファイル末尾に追記します。

 $ nano ~/.bashrc
下記部分を最下段に追加します。


再起動してSSHでログインすると、デバイスドライバがインストールされブザーが鳴ります。


 /dev/ 内には、「rtconunter_*」は存在しない。ので一からデバイスドライバーのインストール
 rm -rf RaspberryPiMouse でデイレクリごと削除
 shred -u RaspberryPiMouse 完全削除

<Ubuntu用>

 $ git clone https://github.com/rt-net/RaspberryPiMouse.git
 $ cd RaspberryPiMouse / utils
 $ sudo apt install linux-headers- $( uname -r ) build-essential
 $ ./build_install.bash

<光センサー4個入力>
 /dev/rtlightsensor0を読み取り、光センサで検出された物体の近接度(0:遠い〜4095:近い)を取得します。
 # cat /dev/rtlightsensor0
 # Return value: [front right] [right] [left] [front left]
 $ cat /dev/rtlightsensor0
  9 2 13 3

<SW入力3個のON/OFF状態読取り>
 /dev/rtswitch0〜/dev/rtswitch2を読み取りスイッチのON / OFF状態を取得します。
 # cat /dev/rtswitch[0,1,2]
 # Return value: 1(Open), 0(Pressed)
 $ cat /dev/rtswitch0

<ブザーを鳴らします。>
 /dev/rtbuzzer0 に0 ~ 20000を書き込みブザーを鳴らします。
 # echo 0 ~ 20000(Hz) > /dev/rtbuzzer0
 $ echo 440 > /dev/rtbuzzer0
 $ echo 0 > /dev/rtbuzzer0

<LED4個On/Off>
 /dev/rtled0 ~ /dev/rtled3 に1/0を書き込みLEDを点灯/消灯します。
 # echo 0(OFF) or 1(ON) > /dev/rtled[0,1,2,3]
 $ echo 1 > /dev/rtled0
 $ echo 0 > /dev/rtled1

<モーター制御>
 /dev/rtmotoren0 に 1/0 を書き込みモータ操作を有効/無効にします。
 # echo 0(disable) or 1(enable) > /dev/rtmotoren0
 $ echo 1 > /dev/rtmotoren0

 /dev/rtmotor_raw_l0 または /dev/rtmotor_raw_r0 に 0 ~ ±10000 を書き込み、モータドライバへのPWM周波数を設定します。
 # echo 0 ~ 10000(Hz) > /dev/rtmotor_raw_[l0, r0]
 $ echo 1 > /dev/rtmotoren0
 $ echo 400 > /dev/rtmotor_raw_l0

 /dev/rtmotor0に左右のPWM周波数と動作時間を書き込み、左右のモータを回します。
 # echo [left_freq Hz] [right_freq Hz] [duration ms] > /dev/rtmotor0
 $ echo 1 > /dev/rtmotoren0
 $ echo 400 800 1000 > /dev/rtmotor0

<パルスカウンター読み込み・書込み>
 /dev/rtcounter_*を読み取りモータドライバへのPWMパルス数を取得します。また、値を書き込みカウントをリセットします。
 符号なしカウンター:/dev/rtcounter_l0、/dev/rtcounter_r0
 符号付きカウンター:/dev/rtcounter_l1、/dev/rtcounter_r1
 # cat /dev/rtcounter_[l0, r0]
 # Return value: 0 ~ 65565 (counts of PWM pulse)
 # cat /dev/rtcounter_[l1, r1]
 # Return value: -32767 ~ 32767 (counts of PWM pulse)
 $ cat /dev/rtcounter_l0
 1104
 $ echo 0 > /dev/rtcounter_l0
 $ cat /dev/rtcounter_l0
 0
やはり「rtcounter_**」ファイルが無い。

RaspberryPiMouse V2 -> V3 で拡張された機能でモーター駆動PWMをカウント出来る。(手持ちはV2の為、機能が無いことが解った。)

別途変換コネクター(¥5000-)を購入する必要あり、変換コネクターにICが2個搭載している。