ADRPTB8C制御基盤を使った本格的なロボット開発 for ラズパイ

ADRPTB8Cでロボット開発にチャレンジ!!

こんにちは。

AI coordinatorの清水秀樹です。

ついにAI coordinator初のロボット基盤が完成?しました。

我ながらよく作ったと自分で自分を褒めたいですね。

ADRPTB8Cを活用したことで、面倒なはんだ付け等、一切使用しないでロボットアーム付きのロボットを構築できました。

全てpythonで制御できるように開発しています。(そりゃそうだ)

 

ADRPTB8Cを活用することで、ラズパイ初心者でも割と簡単にキャタピラ&ロボットアーム付きロボットを作成することができます。

今回は、このADRPTB8Cを使ったロボット基盤の開発方法を紹介したいと思います。

初心者の方でも作成できるように紹介しますので、興味がある方はぜひチャレンジしてみてください。

 

ADRPTB8Cの準備

何はともあれ、ADRPTB8Cがないと始まりません。

まずはこちらを購入しましょう。

ADRPTB8Cはラズパイと2階建ができる基盤になります。

配線もスッキリできるのでオススメですね。

筆者はブレッドボードを使った配線は練習には便利だと考えていますが、ロボットに搭載するには美しくないと思っていましたので、ちょうど良い基盤が見つかって満足しています。

ADRPTB8Cの詳しい商品説明は公式サイトを参考にしてください。

 

ただ、こちらで紹介している製品の使い方については、筆者のような素人には正直難しいかと思います。

公式サイトでは、NODE-REDを使用した使い方を紹介していますので、クラウドサービスに慣れていない方には少しハードルが高いかと思います。

単純に上記動画のようにDCモーターとサーボモーターを動かすだけなら、NODE-REDを使用する必要はありません。

クラウドサービスを使ったアプリ開発は後々チャレンジして行けば良いかと思います。

 

環境準備

ADRPTB8Cをラズパイに2階建として搭載すれば、すぐにでも使えるようになるという訳ではございません。

当然ながら環境準備が必要になります。

備忘録の意味も含めて、順を追って説明していきます。

 

I2C設定

まずはラズパイ本体側の設定から始めましょう。

ラズパイの設定画面でI2Cを有効にします。

以上です。

I2Cとはなんぞやと思う方は、ググってみてください。

色々なサイトで紹介があります。

 

ADRPTB8Cのセットアップ

ラズパイのI2C接続を有効にしたら、次はADRPTB8Cの環境準備です。

ADRPTB8CでDCモーターやサーボモーターを動かすには、Adafruit_Python_PCA9685ライブラリー等が必要になります。

以下のコマンドでダウンロードどインストールを実行しましょう。

$ git clone https://github.com/adafruit/Adafruit_Python_PCA9685.git
$ cd Adafruit_Python_PCA9685
$ sudo python setup.py install

$ git clone https://github.com/adafruit/Adafruit-Motor-HAT-Python-Library.git
$ cd Adafruit-Motor-HAT-Python-Library
$ sudo python setup.py install

色々インストールしたので、上記だけで動くか不明ですが、もしライブラリーが不足してエラーが出る方がいらっしゃったら連絡ください。

 

DCモーターとサーボモーターを接続

画像は公式サイトから拝借しています。

実はDCモーターを接続するときに、モーターケーブルを上記画像の白い物体にどうやって差し込めば良いかわからず30分ぐらい格闘していました。

結果的に、単純に爪の部分を押し込んでケーブルを差し込むだけで取り付けられました。

壊れそうでも思い切ってマイナスドライバーかなんかで爪を押し込んでみましょう。

スコッとケーブルが差し込めるはずです。

 

サーボモーターは3ピンですので、そのまま差し込めば良いかと思います。

 

I2Cアドレスの確認

I2C接続が成功しているかどうかを確認するには、ポートの動作確認で確認します。

pi@raspberrypi:~ $ sudo i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: 60 -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: 70 -- -- -- -- -- -- --                         
pi@raspberrypi:~ $ 

上記のように表示されていれば問題ありません。

正直なところ意味はよくわかりませんが、アドレス60、70で接続しているという意味らしいです。

プログラミングする際に、このアドレスが必要になりますので覚えておきましょう。

 

pythonソースコード

筆者が作成したロボットは、DCモーター2つとサーボモーター4つになります。

それを動かせるソースコードをサクッと作ってみました。

ターミナルから文字を打ち込んで動く仕組みでソースを作成しています。

ただの動作確認用ソースなので悪しからず。

#!/usr/bin/python
from Adafruit_MotorHAT import Adafruit_MotorHAT
 
import time
import atexit

import Adafruit_PCA9685

# create a default object, no changes to I2C address or frequency
mh = Adafruit_MotorHAT(addr=0x60)
myMotor1 = mh.getMotor(1)
myMotor2 = mh.getMotor(2)

# servo
pwm = Adafruit_PCA9685.PCA9685(address=0x60)
pwm.set_pwm_freq(60)

def move(degree_1,degree_2,degree_3,degree_8):
    degree_1 = int(degree_1 * 5.27)
    degree_2 = int(degree_2 * 5.27)
    degree_3 = int(degree_3 * 5.27)
    degree_8 = int(degree_8 * 5.27)
    pwm.set_pwm(0, 0, degree_1)
    pwm.set_pwm(1, 0, degree_2)
    pwm.set_pwm(2, 0, degree_3)
    pwm.set_pwm(7, 0, degree_8)


while (True):
    command = raw_input()
    if command == 'f':
	print "Forward! "
	myMotor1.run(Adafruit_MotorHAT.FORWARD)
	myMotor2.run(Adafruit_MotorHAT.FORWARD)
	
	myMotor1.setSpeed(255)
	myMotor2.setSpeed(255)
	time.sleep(1.5)
    
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1.0)
	
    elif command == 'b':
	print "Backward! "
	myMotor1.run(Adafruit_MotorHAT.BACKWARD)
	myMotor2.run(Adafruit_MotorHAT.BACKWARD)
 	myMotor1.setSpeed(255)
 	myMotor2.setSpeed(255)
	time.sleep(1.5)
	
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1.0)
	
    elif command == 'r':
	print "Backward! "
	myMotor1.run(Adafruit_MotorHAT.FORWARD)
	myMotor2.run(Adafruit_MotorHAT.BACKWARD)
 	myMotor1.setSpeed(255)
 	myMotor2.setSpeed(255)
	time.sleep(1.5)
	
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1.0)
    
    elif command == 'l':
	print "Backward! "
	myMotor1.run(Adafruit_MotorHAT.BACKWARD)
	myMotor2.run(Adafruit_MotorHAT.FORWARD)
 	myMotor1.setSpeed(255)
 	myMotor2.setSpeed(255)
	time.sleep(1.5)
	
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1.0)
    
    elif command == '1':
        move(65,0,0,0)
        time.sleep(1)
        move(95,0,0,0)
        time.sleep(1.0)
        
    elif command == '2':
        move(0,90,0,0)
        time.sleep(1)
        move(0,65,0,0)
        time.sleep(1.0)
        
    elif command == '3':
        move(0,0,90,0)
        time.sleep(1)
        move(0,0,55,0)
        time.sleep(1.0)
        
    elif command == '8':
        move(0,0,0,35)
        time.sleep(1)
        move(0,0,0,90)
        time.sleep(1.0)
        move(0,0,0,60)
        time.sleep(1.0)
        
    elif command == '0':
        move(65,90,55,0)
        time.sleep(1)
        
    elif command == 'all':
        print "Forward! "
	myMotor1.run(Adafruit_MotorHAT.FORWARD)
	myMotor2.run(Adafruit_MotorHAT.FORWARD)
	
	myMotor1.setSpeed(255)
	myMotor2.setSpeed(255)
	time.sleep(1)
    
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1)

	print "Backward! "
	myMotor1.run(Adafruit_MotorHAT.BACKWARD)
	myMotor2.run(Adafruit_MotorHAT.BACKWARD)
 	myMotor1.setSpeed(255)
 	myMotor2.setSpeed(255)
	time.sleep(1)
	
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1)
	
	print "Backward! "
	myMotor1.run(Adafruit_MotorHAT.FORWARD)
	myMotor2.run(Adafruit_MotorHAT.BACKWARD)
 	myMotor1.setSpeed(255)
 	myMotor2.setSpeed(255)
	time.sleep(1)
	
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1)
    
	print "Backward! "
	myMotor1.run(Adafruit_MotorHAT.BACKWARD)
	myMotor2.run(Adafruit_MotorHAT.FORWARD)
 	myMotor1.setSpeed(255)
 	myMotor2.setSpeed(255)
	time.sleep(1)
	
	print "Release"
	myMotor1.run(Adafruit_MotorHAT.RELEASE)
	myMotor2.run(Adafruit_MotorHAT.RELEASE)
	time.sleep(1)
    
        move(95,0,0,0)
        time.sleep(0.5)
        
        move(0,90,0,0)
        time.sleep(0.5)
        move(0,65,0,0)
        time.sleep(0.5)
        
        move(0,0,90,0)
        time.sleep(0.5)
        move(0,0,55,0)
        time.sleep(0.5)
        
        move(0,0,0,35)
        time.sleep(0.5)
        move(0,0,0,90)
        time.sleep(0.5)
        move(0,0,0,60)
        time.sleep(0.5)
        
        move(65,90,55,0)
        time.sleep(0.5)

 

今後の発展について

とりあえずロボット基盤は出来上がったので、これで本格的にAIを搭載したロボット開発の着手が可能となりました。

色々なセンサーとAIを組み合わせて、AI coordinator独自のロボット開発を進めていきたいと思います。

 

それではまた。

その他のPROTECT KIDS開発記事はこちら

あなたにオススメの記事

コメント

  1. アバター
    • タニシ
    • 2018年 3月 11日

    こんにちは。ラズパイに興味を持ってこちらに行き着きました。ものすごく学習させていただいています。
    今まったく同じようなものを作って見ようと思い、部品購入を検討していたのですがカメラまわりがわかりません。
    どこのカメラですか?カメラを動かしてるのはサーボモータですか?ロボットの部分の詳細な記事を作ってもらえると助かります。
    このサイトの繁栄のためにアフェに協力させていただきます。

    • アバター

      タニシさん。
      こんにちは。

      ロボットの部品周りの記事は近いうちに作成しますので、参考にして頂ければと思います。
      カメラはアマゾンで適当なUSBカメラを購入しました。
      動かしているのもサーボモーター です。

      よろしくお願い致します。

      • アバター
        • タニシ
        • 2018年 3月 14日

        SHIMIZUさん。お返事ありがとうございます。
        記事楽しみにしております。

  2. アバター
    • 橋本俊治
    • 2020年 7月 18日

    すごく参考になりました!ありがとうございます!

PAGE TOP