Freenove Arduino用六脚ロボットキット ― 2025/10/31
アリエクで Freenove 6脚ロボットキットを買って組み立てました。(¥12,638コントローラ付き)
箱が結構つぶれていましたが、中身は大丈夫でした。
とりあえず動きました。動画では超音波センサーがついていますが、キットには含まれません。
Wifi経由でスマホアプリやパソコン用のProcessingというアプリでコントロールできます。
ロボット本体のCPUは ATNEGA2560-16AU
GPIOのヘッダーがあるのでセンサーなどが取り付けられます。
写真にあるヘッダーに超音波センサーを付けて、障害物をよけるようにしました。
●配線
HC-SR04 -> Header pin
Trig -> 2pin
Echo -> 3pin
Vcc -> 3.3V
Gnd -> GND
●動作
1,前足右を2回振る
2,前進
3,物が20cm以内なら左に回転
4,5回左に回転しても物がある場合、スリープ
謎な点
センサープログラムをロボットに組み込んでみたら、1回目に値がおかしい場合がある。ワークアラウンド:とりあえず2回読む。
●スケッチ
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#ifndef ARDUINO_AVR_MEGA2560
#error Wrong board. Please choose "Arduino/Genuino Mega or Mega 2560"
#endif
// Include FNHR (Freenove Hexapod Robot) library
#include <FNHR.h>
// ====================== 設定 ======================
const uint8_t TRIG_PIN = 2; // 出力 (TRIG)
const uint8_t ECHO_PIN = 3; // 入力 (ECHO)
//#define DEBUG_SERIAL
FNHR robot;
void setup() {
// Custom setup code start
#ifdef DEBUG_SERIAL
Serial.begin(9600);
#endif
// 測距センサー
pinMode(TRIG_PIN, OUTPUT);
pinMode(ECHO_PIN, INPUT);
digitalWrite(TRIG_PIN, LOW); // まず LOW にしておく
// Custom setup code end
// Start Freenove Hexapod Robot
robot.Start();
//前足を振る
leg_move();
leg_move();
}
void loop() {
// Custom loop code start
static unsigned int count = 0;
long distance = measureDistance();
delay(5);
distance = measureDistance();
#ifdef DEBUG_SERIAL
if (distance >= 0) { // -1 はエラー
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm");
} else {
Serial.println("Out of range / timeout");
}
#endif
if (distance > 20) {
// Crawl forward
crowl_forward(4);
count = 0;
}
else {
// Turn left
turn_left(4);
delay(1000);
++count;
if (count > 4) {
robot.SleepMode();
count = 0;
while (true); //stop
}
}
}
//動作
void leg_move() {
// Active mode
robot.ActiveMode();
delay(500);
robot.LegMoveToRelatively(1, 10, 60, 50);
delay(200);
robot.LegMoveToRelatively(1, -20, -10, -10);
delay(100);
robot.LegMoveToRelatively(1, 40, 10, 10);
delay(100);
robot.LegMoveToRelatively(1, -40, -10, -10);
delay(100);
robot.LegMoveToRelatively(1, 20, 10, 10);
delay(200);
robot.LegMoveToRelatively(1, -10, -60, -50);
}
void crowl_forward(unsigned int count) {
for (unsigned int i = 0;i < count;i++) {
// Crawl forward
robot.CrawlForward();
}
}
void crowl_backward(unsigned int count) {
for (unsigned int i = 0;i < count;i++) {
// Crawl Backward
robot.CrawlBackward();
}
}
void crowl_left(unsigned int count) {
for (unsigned int i = 0;i < count;i++) {
// Crawl Backward
robot.CrawlLeft();
}
}
void crowl_right(unsigned int count) {
for (unsigned int i = 0;i < count;i++) {
// Crawl Backward
robot.CrawlRight();
}
}
void turn_left(unsigned int count) {
for (unsigned int i = 0;i < count;i++) {
robot.TurnLeft();
}
}
// ====================== 測定関数 ======================
long measureDistance() {
// 1. TRIG を 10µs HIGH にする
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10);
digitalWrite(TRIG_PIN, LOW);
// 2. ECHO パルス幅を取得(max 30 ms = 30000 µs)
// timeout_ms を設定して無限待ちにならないように
const uint32_t timeout_us = 30000; // 30 ms
uint32_t pulse = pulseIn(ECHO_PIN, HIGH, timeout_us);
if (pulse == 0) return -1; // タイムアウト
// 3. 距離を cm に変換
long distance_cm = pulse / 58; // 1cm ≈ 58µs(往復)
return distance_cm;
}
コメント
トラックバック
このエントリのトラックバックURL: http://shirusu.asablo.jp/blog/2025/10/31/9813817/tb



コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。