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の入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
日本の首都は

コメント:

トラックバック

このエントリのトラックバックURL: http://shirusu.asablo.jp/blog/2025/10/31/9813817/tb