今回は前からちょこちょこ取り組んでいたXIAO RP2040を使ったマイコンカーの基板をFusionPCBのPCBAに発注してみた内容です!
FusionPCBはSeeed Studioが運営しているプリント基板製造サービスです。
FusionPCBのサービス紹介のページ: https://www.seeedstudio.com/fusion.html
※PRありです
基板とプロジェクト
プロジェクト
こんなようなマイコンカーを作ってみました!
- 使ったマイコンは「Seeed Studio XIAO RP2040」
- 赤外線リモコンで操作できるようにする
- 進行方向に合わせて基板上のLEDが点灯する
- 基板は各モジュールをつなげる役目にする
- 見た目にこだわらず、とりあえず動くものをつくる!
発注した基板
Seeed Studioが運営しているプリント基板製造サービス「FusionPCB」に発注した基板です!
FusionPCBのPCBAサービス紹介のページ: https://www.seeedstudio.com/pcb-assembly.html
注文ページ英語版: https://www.seeedstudio.com/fusion_pcb.html
注文ページ日本語版: https://www.fusionpcb.jp/fusion_pcb.html
今回の基板はマイコンやモータードライバなどの各モジュールをつなげるだけでいいよーというのをコンセプトに設計しました。
基板上部のLEDは進行方向に合わせて点灯させるようにしています。
基板の真ん中にマイコン、その後ろにモータードライバ、そのまた奥に赤外線受信モジュールが来るようにしています。ターミナルブロックに電源とモーターの配線がつながるようにしています。
また、スルーホールの部品を用いたのは自分ではんだ付けがしやすいようにするためです✌️
スルーホール部品でもしっかり部品実装していただけました🙇♂️
今回の基板も黒基調のいい感じに仕上げてもらっています✨
出来上がったマイコンカー
この車の心臓部分にあたるマイコンは「XIAO RP2040」を使っています。ほぼRaspberryPiPicoをこのサイズ間で使えるのは嬉しいですね!(実装部品指示でソケットとヘッダを間違えてしまって、メスメスのジャンプワイヤーで対応しています(笑))
XIAOシリーズは形やピン数など統一されたモジュールなので、無線が使えるもの(XIAO_ESP32C3など)に付け替えることで、WiFiやBluetooth経由での操作もできそうな予感がしてます!
モータードライバは安心と安定の秋月電子の「DRV8835使用ステッピング&DCモータドライバモジュール(通販コード:K-09848)」を使っています。
モーター部分と車体部分には以下のパーツを使っています。
プログラムコード
Arudino言語で書いたコードです。
これといったひねりはありませんが、赤外線を受信してそれに合わせてモーターを動かして、LEDを点灯させよう!といった内容です。
また、今回使ったマイコンに搭載されているRP2040はデュアルコア設計(言葉あってるかな…)のため、setup1()&loop1()をつかって同時に2つの動作を指示できます。今回は2つめの動作にマイコンモジュール基板についているLEDを光らせるようにしてみてます。
// XIAO_RP2040_CAR
//XIAOラジコンカー
//https://jcomet.com/
#include <IRremote.h>
#include <Adafruit_NeoPixel.h>
const int irReceivePin = 0;
IRrecv irrecv(irReceivePin);
int leds[] = {7, 28, 29, 6}; // front, left, right, back
int INA[] = {4, 3}; // INA1, INA2
int INB[] = {2, 1}; // INB1, INB2
int Power = 11;
int PIN = 12;
#define NUMPIXELS 1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
irrecv.enableIRIn();
for (int i = 0; i < 4; i++) {
pinMode(leds[i], OUTPUT);
}
}
//進行方向LEDとモーター動作用の関数
void controlLEDandMotor(int ledIndex, int INA1Value, int INA2Value, int INB1Value, int INB2Value) {
for (int i = 0; i < 4; i++) {
digitalWrite(leds[i], i == ledIndex ? HIGH : LOW);
}
analogWrite(INA[0], INA1Value);
analogWrite(INA[1], INA2Value);
analogWrite(INB[0], INB1Value);
analogWrite(INB[1], INB2Value);
}
void loop() {
if(irrecv.decode()) { //受信したか確認する
if(irrecv.decodedIRData.command == 24 ){
controlLEDandMotor(0, 100, 0, 100, 0);
}
else if(irrecv.decodedIRData.command == 8 ){
controlLEDandMotor(1, 100, 0, 0, 0);
}
else if(irrecv.decodedIRData.command == 90 ){
controlLEDandMotor(2, 0, 0, 100, 0);
}
else if(irrecv.decodedIRData.command == 82 ){
controlLEDandMotor(3, 0, 100, 0, 100);
}
else if(irrecv.decodedIRData.command == 28 ){
controlLEDandMotor(-1, 0, 0, 0, 0); // -1 の時はLEDを消す
}
irrecv.resume(); //resultsの値をリセット
}
}
//マイコン基板上のLEDを光らせる
void setup1() {
pixels.begin();
pinMode(Power,OUTPUT);
digitalWrite(Power, HIGH);
}
void loop1() {
pixels.clear();
pixels.setPixelColor(0, pixels.Color(15, 25, 205));
delay(400);
pixels.show();
pixels.clear();
pixels.setPixelColor(0, pixels.Color(103, 25, 205));
delay(400);
pixels.show();
pixels.clear();
pixels.setPixelColor(0, pixels.Color(233, 242, 205));
delay(400);
pixels.show();
pixels.clear();
pixels.setPixelColor(0, pixels.Color(233, 23, 23));
delay(400);
pixels.show();
pixels.clear();
pixels.setPixelColor(0, pixels.Color(12, 66, 101));
delay(400);
pixels.show();
delay(500);
}
動かしてみた🚙
前進とバックはしっかり動いてくれました!
マイコンボード上のLEDもしっかりキラキラしてよかったです🥳
曲がるのは車体の設計がまだまだなのかぎこちない感じになってしまいました😅
次作るときに改良ですね🧐
感想
今回のプロジェクトを通じて、ラジコン用の車体組みやモーターと赤外線を用いた回路など新しいスキルと知識を身につけることができ、とても有意義な経験でした。ラジコンカーはいろいろと奥が深そうなので引き続き取り組んでいきたいと思います!
自分のオリジナル基板ができるとすごくわくわくしますし、ちゃんと動いてくれた時はやっぱり感動しますね😊
今後もこのようなプロジェクトを通じて、新しい技術や知識を学びつつ、それを皆様と共有できればと思います。次回のプロジェクトもお楽しみにしていただけますとうれしいです!
コメント