kozyonikkiのブログ

どこか知の旅に出たときのことを書いていきます。

タミヤのカムプログラミングロボットを改造した話

adventar.org
19日目の記事です。

目次

  • 全体像の話
  • WSLのインストール
  • ラズパイで使うOSをインストールする
  • WSLとラズパイをSSH通信する
  • カムプログラミングロボットを組み立てる
  • 回路とかの話
  • コードについて
  • 動かしての感想とその他
全体像の話

タミヤのカムプログラミングロボットをラズパイを使ってSSHで遠隔制御できるようにしていきます。

WSLのインストール

WindowsパソコンでSSHで通信するためにTera termなど使ってやる場合もありますが、今回はWSL(Windows Subsystem for Linux)を使ってラズパイとSSHをします。 以下のURLからWSLをインストールできます。
https://www.microsoft.com/ja-jp/p/ubuntu/9nblggh4msv6#activetab=pivot:overviewtab

WSLのインストールが終わったあと起動してみると、WslRegisterDistribution failed with error 0x8007019e というエラーが出ました。
そこで、[コントロール パネル] - [プログラムと機能] - [Windows の機能の有効化または無効化] を開いて、[LinuxWindows サブシステム] にチェックをつける操作をして解決しました。
https://docs.microsoft.com/ja-jp/windows/wsl/troubleshooting

再度WSLを起動するとユーザー名とパスワードを聞かれるので指示に従って設定して見てください。ubuntuにインストールされているパッケージ情報のダウンロードとパッケージのアップデートをします。

sudo apt update  
sudo apt upgrade  



参考にした記事 qiita.com

ラズパイで使うOSをインストールと下準備

今回は家にあったRaspberryPi 3 Model B+にubuntu server 20.04.3LTS (RPI 2/3/4/400)をインストールしました。
以下の記事を参考にインストールして見てください。 qiita.com

設定が終わったらラズパイに無線LANとモニターを繋げて電源をつけます。WSLで行ったようにラズパイでもubuntuにインストールされているパッケージ情報のダウンロードとパッケージのアップデートをします。

sudo apt update  
sudo apt upgrade  



WSLとラズパイをSSH通信する

まず、以下のコマンドを打ってラズパイのipアドレスを確認します。

ip -a 

有線LAN接続をしているので eth0: の欄に書かれているプライベートIPアドレス(192.168.~/24)を控えておきます。 WSLに以下のコマンドを打ってラズパイとssh通信をします。

ssh ラズパイのユーザー名@ipアドレス

通信をする際に接続するかどうかを聞かれるのでyesと答えます。



参考にした記事 qiita.com


余談(うまく行った人は読み飛ばしてもらって構いません)

WSLとラズパイでsshしようと思ったら、エラーが出てきました。

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!    @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
~中略~
Host key verification failed.

と出て通信ができませんでした。
解決方法として、

cd .ssh
ls

と入力すると.sshというディレクトリにknown_hostsというのがあるのでこれを

rm known_hosts

で削除すると動作しました。
最初に使っていたラズパイ側のOSが壊れてしまって、再度OSインストールしてWSLでsshしようとしたらこのようなエラーが出ました。
ラズパイ側の前のOSと再度インストールしたOSの公開鍵暗号が違うためそれが悪さをしていたのかな という感じでしょうか...(多分違うかも)
詳しいことはまだわかってないのでもう少し暗号化通信の学びが必要だなと感じました。




カムプログラミングロボットを組み立てる

以下のタミヤのロボットを説明書通りに組み立てます。
Amazon | タミヤ 楽しい工作シリーズ No.227 カムプログラムロボット 工作セット 70227 | ホビー用素材 通販

組み立てた後、プログラムピンを挿してロボットを動かす機構を取り外します。 組み立て終わったロボットはこのようになりました。 f:id:kozyonikki:20211212011316j:plain

組み立てたときの感想として、力が無いのか止め方が悪いのか、止めがガバガバ過ぎている気がしました。特に腕の根本など。 なるべく取っ手の長いドライバーを使って組み立てられるといいと思います。(精密ドライバーを使って組み立てていたので...)

回路とかの話

使ったものは

回路は以下のようになっています。 f:id:kozyonikki:20211215004100p:plain

f:id:kozyonikki:20211219002451j:plain
実際の写真

コードについて

PWM制御で進む速さなどを調節せず、(常にフルで動く)ON/OFF制御でロボットを操作しています。 コードはシェルで書いています。 以下がコードになります。

以下の記事を参考にラズパイを制御しました。 tool-lab.com

#!/bin/bash

#a1=15
#a2=14
#b1=18
#b2=23

echo 14 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio14/direction
echo 15 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio15/direction
echo 18 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio18/direction
echo 23 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio23/direction

while :
do
    echo "方向を入力してください"
    read key

    if [ "$key" = "s" ]; then
        echo "まっすぐ進む"
        echo 1 > /sys/class/gpio/gpio14/value
            echo 0 > /sys/class/gpio/gpio15/value
            echo 1 > /sys/class/gpio/gpio18/value
            echo 0 > /sys/class/gpio/gpio23/value 
    
    elif [ "$key" = "d" ]; then
        echo "右に旋回"
            echo 0 > /sys/class/gpio/gpio14/value
            echo 1 > /sys/class/gpio/gpio15/value
            echo 1 > /sys/class/gpio/gpio18/value
            echo 0 > /sys/class/gpio/gpio23/value
    
    elif [ "$key" = "a" ]; then
        echo "左に旋回" 
            echo 1 > /sys/class/gpio/gpio14/value
            echo 0 > /sys/class/gpio/gpio15/value
            echo 0 > /sys/class/gpio/gpio18/value
            echo 1 > /sys/class/gpio/gpio23/value
    
    elif [ "$key" = "f" ]; then
        echo "バック" 
        echo 0 > /sys/class/gpio/gpio14/value
        echo 1 > /sys/class/gpio/gpio15/value
        echo 0 > /sys/class/gpio/gpio18/value
        echo 1 > /sys/class/gpio/gpio23/value
    
    elif [ "$key" = "" ]; then
        echo "停止処理"
        echo 0 > /sys/class/gpio/gpio14/value
        echo 0 > /sys/class/gpio/gpio15/value
        echo 0 > /sys/class/gpio/gpio18/value
        echo 0 > /sys/class/gpio/gpio23/value

    fi
done



方向入力を聞かれるので以下のように入力して見てください

入力 制御動作
s+[Enter] まっすぐ進む
d+[Enter] 右に回る
a+[Enter] 左に回る
f+[Enter] 後ろに進む
[Enter] 停止

入力通りに動かなかった場合は配線が間違ってないか確認してみてください。

ラズパイに以下のコマンドを打つとコードのファイルをダウンロードできます。

git clone https://github.com/GlassesGoat/kamurobo.git

コードに実行権限を与えます。

cd kamurobo
chmod +x robo.sh

rootユーザーになってからファイルを実行すると操作できるようになります。

sudo su
./robo.sh
動かしての感想とその他

モーターを動かすための電池が高すぎる(多分1.5vの乾電池3本くらいがいいかも)、もしくはPWM制御で速度を変えないといけないなと思いました。 動作中に[Ctrl]+Cを押す、ラズパイの電源を切る前にモーター駆動用の電池を抜かないと勝手に前進したり動いたりするので危ないです。安全設計では無いのでそこも改善しないと行けないです。
また、有線LAN接続を無線に変更しようと思います。これらは後で追記しようと思います。(アドカレに間に合いませんでした...)

その他参考にした記事
Ubuntu環境を日本語化する | リナスク
Ubuntu Server(Raspberry Pi)のWifi設定〜リモート接続 - Qiita