ニセ COZMO (コズモ) を製作 それすなわち CASMO (カスモ)
長男くんがタブレットを持ってきて「これがほしい!」と見せてきたのが☟コチラ
COZMO(コズモ)というAIロボットのようでスマホやらでコントロールできるみたい。
子供たちはほとんどテレビは観ないでYouTubeばかり観ています。
いろんな知識をYouTubeで得ており、もうお父ちゃん
ただユーチューバーに願うのは子供たちの購買意欲をあまり駆り立てないでほしいということだけ。。。
まぁムリか。。。それで食ってんだもんね。
脱線しましたがCOZMOがほしいと言われて自分でもよくわからないのですが、
なぜかカチンときて「こんなもんは作ってやる!」と思わず言ってしまい
引っ込みがつかなくなったので作ってみました。
なぜカチンと来たのだろうか?価格かな?
我が家では出来合いのモノを極力買い与えないようにしています。
ブロックとかを買うようにしています(有名どころのブロックはほぼあると思う)。
長男くん
またまた脱線しましたがニセCOZMOのCASMO (カスモ)を作製しましたのでご報告いたします。AI機能などは全くないカスみたいな性能ですが手作りのぬくもりを感じていただければ幸いです。
目次
構成
部品
- BLE、WiFi内蔵マイコンボード ESP32-DevKitC-32D
- モータドライバ DRV8835
- ダブルギヤボックス
- TFT液晶ディスプレイモジュール
-
ユニバーサルプレート
- モバイルバッテリ
1.8インチ液晶ディスプレイ
ロボットの顔の表現にはHiLetgoの128×160ピクセルTFTディスプレイを使用しました。ドライバICはST7735RでSPIでデータ通信します。
Arduinoコード用のライブラリとして以下を使用いたしました。
https://github.com/adafruit/Adafruit-GFX-Library
https://github.com/adafruit/Adafruit-ST7735-Library
ESP32との接続は以下の通りです。
☟デモプログラム(graphicstest.ino)を動かしてみました。
おもえば ESP32 でST7735Rディスプレイを使うのは初めてであった。#CASMO pic.twitter.com/EsAv89KKoy
— HomeMadeGarbage (@H0meMadeGarbage) 2019年7月20日
モータドライバDRV8835
モータドライバDRV8835にESP32からPWM信号を入力してモータを制御します。モータドライバのMODEピンはGNDに接続しています。
http://akizukidenshi.com/download/ds/akizuki/AE-DRV8835-Ss.pdf
CASMO
ここではおなじみのスマホアプリBlynkでBluetoothを介してCASMOを遠隔操作します。
今から出勤なので、一旦ここまで#Blynk #ESP32 #CASMO pic.twitter.com/gSMDFi2Xvs
— HomeMadeGarbage (@H0meMadeGarbage) 2019年7月20日
スマホからサーボやモータをコントロールします。サーボにはL字の木製の腕を付けています。連動してディスプレイに目を表示してかわいらしさを演出しております。
可愛いロボット。長男くんも喜んで遊んでます。
ただBluetooth制御しているのですが、チョクチョク切断される。。。
家ではWiFiがいいのかな?#Blynk #ESP32 #CASMO pic.twitter.com/zl7K1FPTFN— HomeMadeGarbage (@H0meMadeGarbage) 2019年7月20日
電源としてモバイルバッテリを使用しています。
Blynk設定
ここではスマホアプリのblynkでBLE32とBluetooth通信でCASMOを動かします。
新規プロジェクトを作成します。ハードウェアはESP32 Dev Boardを選択。Conection TypeにはBluetoothを指定します。
AUTH TOKENはArduinoコード生成時に使用します (アカウント登録したメールに送信されます)。
ウィジェットとしてBluetoothとSlider、Joystickウェジットを配置します。
Sliderウェジットの設定は最小値0と最大値180と設定してヴァーチャルピンV0に出力させました。SEND ON RELEASEはOFFとしてスライド中に常時 値を出力します。サーボモータの角度指定に使用します。
ジョイスティックの設定はx軸とy軸の出力をMERGEしてヴァーチャルピンV1に出力させ、それぞれ値は-190~190としました。y軸の値で前進/後進をx軸で左右モータ回転比指定をします。
AUTO RETURNはONにしてジョイスティックはタップ移動後離すと自動的に中央に戻します。
ROTATE ON TILTはOFFにてスマホの回転に依存せずのx, y軸を固定とします。
Arduino IDEプログラム
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 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
#define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <Adafruit_GFX.h> // Core graphics library #include <Adafruit_ST7735.h> #include <SPI.h> #include <BlynkSimpleEsp32_BT.h> #include <ESP32Servo.h> #define TFT_CS 5 #define TFT_RST 22 #define TFT_DC 21 Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS, TFT_DC, TFT_RST); // You should get Auth Token in the Blynk App. // Go to the Project Settings (nut icon). char auth[] = "BlynkアプリのYourAuthTokenを入力"; int blynkState = 0; Servo myservo; int servoPin = 16; int s = 0; //channel name const int forwardL = 4; const int rearL = 5; const int forwardR = 6; const int rearR = 7; long Speed; long SpeedL, SpeedR; int servoState = 0; void iniImage() { tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE); tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE); } //サーボモータ BLYNK_WRITE(V0) { if(servoState == 0){ servoState = 1; myservo.attach(servoPin, 1000, 2000); delay(15); } s = param.asInt(); Serial.println(s); iniImage(); tft.fillCircle(map(s, 0, 180, 20, 108), 40, 20, ST77XX_BLACK); tft.fillCircle(map(s, 0, 180, 20, 108), 120, 20, ST77XX_BLACK); myservo.write(s); delay(100); } //モータ BLYNK_WRITE(V1) { if(servoState == 1){ servoState = 0; myservo.detach(); delay(15); } long x = param[0].asInt(); long y = param[1].asInt(); Serial.print("x: "); Serial.print(x); Serial.print(" y: "); Serial.print(y); iniImage(); tft.fillCircle(map(s, 0, 180, 20, 108), 40 + map(x, -190, 190, 30, -30), 20, ST77XX_BLACK); tft.fillCircle(map(s, 0, 180, 20, 108), 120 + map(x, -190, 190, 30, -30), 20, ST77XX_BLACK); Speed = sqrt(x*x+y*y); if(Speed > 255){ Speed = 255; } Serial.print(" Speed: "); Serial.println(Speed); if(y >= 0){ //前進 if(x >= 0){ SpeedL = 0; SpeedR = abs(x); }else{ SpeedL = abs(x); SpeedR = 0; } ledcWrite(forwardL, Speed - SpeedL); //channel, duty ledcWrite(rearL, 0); ledcWrite(forwardR, Speed - SpeedR); ledcWrite(rearR, 0); }else{ //後進 if(x >= 0){ SpeedL = 0; SpeedR = abs(x); }else{ SpeedL = abs(x); SpeedR = 0; } ledcWrite(forwardL, 0); ledcWrite(rearL, Speed - SpeedL); ledcWrite(forwardR, 0); ledcWrite(rearR, Speed - SpeedR); } } void setup(){ // Debug console Serial.begin(9600); Serial.println("Waiting for connections..."); ledcSetup(forwardL, 5000, 8); //channel, freq, resolution_bits ledcSetup(rearL, 5000, 8); ledcSetup(forwardR, 5000, 8); ledcSetup(rearR, 5000, 8); ledcAttachPin(25, forwardL); //pin, channel ledcAttachPin(26, rearL); ledcAttachPin(33, forwardR); ledcAttachPin(32, rearR); myservo.setPeriodHertz(50); // standard 50 hz servo tft.initR(INITR_BLACKTAB); // Init ST7735S chip, black tab tft.fillScreen(ST77XX_BLACK); Blynk.setDeviceName("Blynk"); Blynk.begin(auth); } void loop(){ Blynk.run(); if(blynkState == 0 && Blynk.connected()){ iniImage(); tft.fillCircle(64, 40, 20, ST77XX_BLACK); tft.fillCircle(64, 120, 20, ST77XX_BLACK); blynkState = 1; }else if (blynkState == 1 && Blynk.connected() == 0){ tft.fillScreen(ST77XX_BLACK); blynkState = 0; } } |
スライダ(ヴァーチャルピンV0)でサーボを、ジョイスティック(ヴァーチャルピンV1)でモータを制御します。同時にディスプレイの目玉を動かします。Bluetooth接続されると目が表示され、切断されると表示が消えます。
こんなもんやろか。#Blynk #ESP32 #CASMO pic.twitter.com/OnuGZCuRoy
— HomeMadeGarbage (@H0meMadeGarbage) 2019年7月20日
動作
ニセ COZMO (コズモ) すなわち CASMO (カスモ) 爆誕#ESP32 #Blynk #親子 #愛
タカラトミーCOZMOをAmazonでチェック https://t.co/SgKaDL63Ij pic.twitter.com/IItyWdO0Os
— HomeMadeGarbage (@H0meMadeGarbage) 2019年7月20日
本物を知るということも大事ですが、こういったように目の前で作ってみせてあげるのも親の務めではないでしょうか。
作るものは何でもよいと思っています。ごはん支度を子供に見せるようにするのでも後にだいぶ違ってくるのではないでしょうか?
すぐにどんどん自発的に考えるようになって親の考えもしないようなことをやってくれるようになることでしょう。その時にほんの一片でもお父ちゃん
追記
キャタピラ化 (2019/7/22)
長男くん
よりCOZMO (コズモ)に近づいた。。。かな。。?
長男くんの要望によりキャタピラにしました。より本物志向へ#Blynk #CASMO #ESP32 pic.twitter.com/GKfo4RO0bT
— HomeMadeGarbage (@H0meMadeGarbage) 2019年7月22日
フォークリフト (2019/7/25)
腕に棒をつけてフォークリフトっぽくしました。
パワフル!
棒を追加しました、
次はビー玉が出る武器を作れとのことです。。。
ソレノイドか?な? #CASMO #ESP32 pic.twitter.com/9lJn3Q85rt— HomeMadeGarbage (@H0meMadeGarbage) July 24, 2019
かな?
いや普通に凄い!