はじめに
PuppyCにM5StickCを接続して動かしてみます。
- 必要なもの
- スケッチ例
- 実行
1.必要なもの
M5SticKCとPuppyCが必要です。
番号 |
商品名 |
価格 |
参考販売店 |
1 |
M5StickC |
1980円(セット) 1650円(本体のみ) |
|
2 |
PuppyC |
2002円 |
PuppyCはM5StickC用の四脚ロボットベースです。
長方形の箱に入っていますが、半分はクッションです。
2.PuppyCの動作確認
PuppyCの動作確認はスケッチ例の中にある「PuppyC」で確認します。
[ファイル]⇒[スケッチ例]⇒[M5StickC]⇒[HAT]⇒[PuppyC]でスケッチを書き込みます。
ソースコードを見ると、puppy.hがインクルードされています。これはpuppuy.cppで作成した関数 IIC_Init()、angle_all_set、angle_setを使用するためです。
初期化用の関数IIC_Init()はpuppy.cppで定義されています。WireはI2Cとの通信を可能にするために必要なライブラリです。beginで接続します。第1引数はデータを送受信するためのポート名、第2引数はクロックに使用するポート名、第3引数は周波数(100は100kbit/s)です。
1 2 3 4 |
void IIC_Init() //sda 0 scl 26 { Wire.begin(0,26,100); } |
GitHubにあるESP32のWire.hを見るとデフォルト値は以下のように設定されています。
1 |
bool begin(int sda=-1, int scl=-1, uint32_t frequency=0); // returns true, if successful init of i2c bus |
angle_all_setは4つのサーボモーターすべての動作位置を指定、angle_setは個々のサーボモーターの動作位置を決定するのに使用します。
Wire.beginTransmission(SERVO_ADDRESS)でサーボ―モータを動かすためのアドレスを設定します。このあと、Wire.Write()でデータを送信したのち、Wire.endTransmission()で通信を終了します。angle_all_setは第1引数からサーボモーターの1番、2番、3番、4番に割り振られています。設定する値は角度(angle )を表しています。値に90と記述すると90°を意味し、サーボモーターが地面と垂直になっている状態です。
1 2 3 4 5 6 7 8 9 10 |
void angle_all_set(uint8_t angle1,uint8_t angle2,uint8_t angle3,uint8_t angle4) { Wire.beginTransmission(SERVO_ADDRESS); Wire.write(0x00); Wire.write(angle1); Wire.write(angle2); Wire.write(angle3); Wire.write(angle4); Wire.endTransmission(); } |
angle_all_setが全体のサーボモーターに設定しているのに対して、angle_setは個別にサーボモーターを設定することができます。内部で使用している関数はangle_all_setと同様です。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
uint8_t angle_set(uint8_t pos,uint8_t anglex) { if(pos<1 || pos>5) { return 0; } pos-=1; Wire.beginTransmission(SERVO_ADDRESS); Wire.write(pos); Wire.write(anglex); Wire.endTransmission(); return 1; } |
PuppyCではangle_all_setを使用して前に進むための関数puppy_startと後ろに進むための関数puppy_backを作成しています。
サーボモーターの1番は左前足、2番は右の後足、3番が左の後足、4番が右の前足となっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#include <M5StickC.h> #include "puppy.h" void puppy_start() { angle_all_set(90,90,90,90); //servo 1 2 3 4 => set 90° delay(100); } void puppy_go() { angle_all_set(55,60,130,120); //servo 1 2 3 4 delay(100); angle_all_set(55,160,130,120); //servo 1 2 3 4 delay(100); angle_all_set(120,130,150,60); //servo 1 2 3 4 delay(100); angle_all_set(120,130,60,60); //servo 1 2 3 4 delay(100); angle_all_set(55,130,60,60); //servo 1 2 3 4 delay(100); angle_all_set(55,60,130,30); delay(100); } void puppy_back() { angle_all_set(120,130,60,55); delay(100); angle_all_set(120,130,160,55); delay(100); angle_all_set(60,150,130,120); delay(100); angle_all_set(60,60,130,120); delay(100); angle_all_set(60,60,130,55); delay(100); angle_all_set(30,130,60,55); delay(100); } // the setup routine runs once when M5StickC starts up void setup(){ // Initialize the M5StickC object M5.begin(); // LCD display M5.Lcd.println(" "); M5.Lcd.println(" IIC_PUPPY"); IIC_Init(); //sda 0 scl 26 /* 1 2 3 4 */ angle_set(1,90); //servo 1 => set 90° angle_set(2,90); angle_set(3,90); angle_set(4,90); delay(1000); } // the loop routine runs over and over again forever /* 1 2 3 4 */ uint8_t cnt=10; void loop() { while(cnt!=0) { cnt--; puppy_go(); } cnt=10; puppy_start(); while(cnt!=0) { cnt--; puppy_back(); } cnt=10; puppy_start(); } |
3.実行
M5StickCをPuppyCの上に載せ、実行すると前に後ろにと交互に動きます。PuppyCの後ろのスイッチをONにしないと書き込みを行っても動作しないので、注意が必要です。スイッチが付いている方が後ろのようです。
参考
コメント