HOME | Raspberry Pi | ビジネス書籍紹介 | 2025-04-04 (Fri) Today's Access : 238 Total : 1156351. Since 10 Sep. 2019

簡易二足歩行ロボット
2025.03.10

YouTube でも紹介しています。画像をクリックすると再生できます。


ピッコロボ(piccorobo)
Freaduino というArduino互換ボードを探していたところ偶然ピッコロボを見つけてぽちっとしてしまいました。 中古品ですが送料込み1400円で変えちゃいました。2014年発売当時の税込み価格は9,955円です。 この旧型ピッコロボには Freaduino が使用されています。



Freaduino Uno Rev1.8
Freaduinoは、モータードライバモジュールなしにそれ自身で最大2A出力することができます。


Freaduino Uno Rev1.8
features:
・Inherits all of Arduino Uno's features.
・Compatible to Arduino Uno/Duemilanove’s pin layout, screw hole and dimensions.
・3.3V or 5V Operating Voltage selecable
・More visible location of Indicator LEDs
・Wide range external input from 7~23V DC
・UART/IIC and SPI interface breakout
・Evolved with SMD components
・Digital I/O pins: 14 (of which 6 provide PWM output)
・Flash memory: 32 KB of which 0.5 KB used by bootloader
・SRAM: 2KB
・EEPROM: 1KB
・Clock speed: 16MHz

【注意】スケッチの書き込み時はサーボやLEDを接続していると、電圧降下でブートローダーが壊れてしまうことがあります。

Arduinoボードの電源の選択肢

UNO Rev3では3.3V出力ピンの最大負荷150mA、5V出力ピンで最大1A、 Freaduinoでは、3.3Vで800mA、5Vで2Aまでの出力が可能です。

【補足:Arduino UNO R4 WiFi】
VINピンから電源を供給すると、電圧を5Vに下げるためにボード上のレギュレーターを利用します。 このとき5Vピンは1.2Aまで供給することができます。 この電圧レギュレータ―は、MCUやLEDを含む他の全ての部品に電源を供給しています。 大電流を引き出す外部デバイス(例: サーボモーター)は5Vピンから電源を供給しないでください。 5Vピンはセンサーモジュールなどの低電流のデバイスで利用することを意図しています。
※USB-Cコネクタ経由で電源を供給すると、ボード上の電圧レギュレータ―は完全に迂回します。 この場合、5Vピンはボードを壊すことなく2Aまで供給することができます
Arduino UNO R4 WiFiユーザーマニュアル

後継のピッコロボIoTでは、サーボモータ、センシング、ネットワーク通信機能を1枚のボードに搭載しています。 Freaduino に実装されていた3.3V/5V動作電圧切替スイッチはなくなっています。 後継のこのボードは環境設定も含め使い勝手が悪いです。 ちなみにFreaduino V1.2ボードは製造が終了していますが、当時の単品価格は2280円程度でした。

FreaduinoにはWiFi機能がないので、ESP8266をシリアル接続して、ネットワーク経由でTELNET接続して制御するようにしました。

WeMos D1 mini V3.0




ピッコロボには4つのサーボモータが取り付けられています。 頭部のサーボモータは首振りなので今回は無視します。
胸のサーボモータは足の上げ下げに使います。 両足のサーボモータは足首を捻るのに使います。


・腰サーボモータ(1本線):4番ピン
・左足サーボモータ(2本線):5番ピン
・右足サーボモータ(3本線):6番ピン
・頭部サーボモータ(4本線):7番ピン


WiFi通信用のESP8266(WeMos D1 mini)とFreaduinoをシリアル接続しています。 ESP8266はFreaduinoからの5V供給で動作させています。
ESP8266Freaduino
TX - RX
5V - 5V
GND - GND


単三電池6本がはいる電池ボックスが同梱されているのですが、試験的にちょっと使ってみるだけなので、 Freaduino UNOのDCプラグにモバイルバッテリーから電力を供給します。

●二足歩行の仕組み

前進を例にとって説明します。


胸のサーボモータを時計回りに回転させて左脚をあげます。


宙に浮いた左脚サーボモータを反時計方向に回転させ、足ビレを反時計方向に回します。


右脚サーボモータを反時計方向に回転させると、地面に着いている足ビレは動くことができず、 筐体側が逆に時計方向に回転し、ロボットの左側が前に迫り出します。


胸のサーボを反時計方向に回転させて、左脚を着地させます。


さらに胸のサーボを反時計方向に回転させて右脚を上げます。


宙に浮いた右脚サーボを時計方向に回転させ、足ビレを時計方向に回します。


左脚サーボを時計方向に回転させると、地面に着いている足ビレは動くことができず、 筐体側が逆に反時計方向に回転し、ロボットの右側が前に迫り出します。


胸のサーボを時計方向に回転させて右脚を着地させます。

●プログラミング

ピッコロボのデモプログラムは下記を参考にしてください
ピッコロボのWiki

今回は歩行の仕組みについての解説なので、プログラムの詳細には触れません。 Freaduino側のソースコードを添付しますので、興味ある方はご覧ください。
・理解しやすいように大幅にプログラムを書き換えました。
・プログラム実行開始時は各サーボモータの角度をゼロに初期化していますが、ロボットに傾きがある場合はオフセット補正を行います。
・各サーボモータに角度を指定した場合に、実際の回転角度にばらつきがある場合、回転角補正が必要です(未実装)。

#include  "Servo.h"

#define FRAME      20   // interval time from current step to next step: 20msecc
int numberOfStep = 10;

int current_angle[4];
int servo_trim[4];      // trim to adjust each servo motors's angle to center
Servo servo[4];

#define PIN_CENTER   4
#define PIN_RIGHT    6
#define PIN_LEFT     5
#define PIN_NECK     7
#define PIN_DELAY   50

#define MOTOR_CENTER 0
#define MOTOR_RIGHT  1
#define MOTOR_LEFT   2
#define MOTOR_NECK   3

char buf[16];

void initServo()
{
	// attach pins to each servo
	servo[0].attach(PIN_CENTER);
	servo[1].attach(PIN_RIGHT);
	servo[2].attach(PIN_LEFT);
	servo[3].attach(PIN_NECK);

	// set trim to each servo
	servo_trim[0] = 0;
	servo_trim[1] = 0;
	servo_trim[2] = 0;
	servo_trim[3] = 0;

	current_angle[0] = 0;
	current_angle[1] = 0;
	current_angle[2] = 0;
	current_angle[3] = 0;

	// rotate all servos to center position
	servo[0].write(90 + servo_trim[0]);
	servo[1].write(90 + servo_trim[1]);
	servo[2].write(90 + servo_trim[2]);
	servo[3].write(90 + servo_trim[3]);
}

void playMotion(int motor, int target_angle)
{
	int loop;

	// check limit
	if(target_angle > 90) {
		target_angle = 90;
	} else if (target_angle < -90) {
		target_angle = -90;
	}

	float rotating_angle = ((float)target_angle - (float)current_angle[motor]) / (float)numberOfStep;
	float tmp_angle      = (float)current_angle[motor];

	loop = numberOfStep;
	while(loop)
	{
		tmp_angle += rotating_angle;

		if (rotating_angle < 0){
			if(current_angle[motor] > target_angle) current_angle[motor]  = (int)tmp_angle; else current_angle[motor] = target_angle;

		} else if(rotating_angle > 0) {
			if (current_angle[motor] < target_angle) current_angle[motor] = (int)tmp_angle; else current_angle[motor] = target_angle;
		}
		servo[motor].write(current_angle[motor] + servo_trim[motor] + 90);

		delay(FRAME);
		loop--;
	}

	// adjust current_angle
	current_angle[motor] = target_angle;
	servo[motor].write(current_angle[motor]+servo_trim[motor]+90);
}

// 遷移時間をフレーム間隔(msec)で割る
void setInterval(int msecInterval)
{
	numberOfStep = msecInterval / FRAME;    //total number of steps to move to next position
}

void setTrim(int motor, int trim)
{
	servo_trim[motor] = trim;

	servo[motor].write(servo_trim[motor] + 90);
}

void moveForward()
{
	setInterval(200);
	playMotion(MOTOR_CENTER,  35); // 左脚を上げる
	playMotion(MOTOR_LEFT,   -15); // 宙に浮いている左脚を時計回りに捩じる
	playMotion(MOTOR_RIGHT,  -15); // 右脚を反時計回りに捩じり、宙に浮いている左脚を前に出す
	setInterval(600);
	playMotion(MOTOR_CENTER,   0); // 左脚を下す
	setInterval(200);
	playMotion(MOTOR_CENTER, -35); // 右脚を上げる
	playMotion(MOTOR_RIGHT,   15); // 宙に浮いている右脚を時計回りに捩じる
	playMotion(MOTOR_LEFT,    15); // 左脚を反時計回りに捩じり、宙に浮いている右脚を前に出す
	setInterval(600);
	playMotion(MOTOR_CENTER,   0); // 右脚を下す
}

void moveBack()
{
	setInterval(200);
	playMotion(MOTOR_CENTER, -35); // 右脚を上げる
	playMotion(MOTOR_RIGHT,  -15); // 宙に浮いている右脚を反時計回りに捩じる
	playMotion(MOTOR_LEFT,   -15); // 左脚を時計回りに捩じる
	setInterval(600);
	playMotion(MOTOR_CENTER,   0); // 右脚を下す
	setInterval(200);
	playMotion(MOTOR_CENTER,  35); // 左脚を上げる
	playMotion(MOTOR_LEFT,    15); // 宙に浮いている左脚を時計回りに捩じる
	playMotion(MOTOR_RIGHT,   15); // 右脚を時計回りに捩じる
	setInterval(600);
	playMotion(MOTOR_CENTER,   0);
}

void turnLeft()
{
	setInterval(200);
	playMotion(MOTOR_CENTER, -35);
	playMotion(MOTOR_RIGHT,    0);
	playMotion(MOTOR_LEFT,    15);
	setInterval(600);
	playMotion(MOTOR_CENTER,   0);
	setInterval(200);
	playMotion(MOTOR_CENTER,  35);
	playMotion(MOTOR_LEFT,     0);
	playMotion(MOTOR_RIGHT,   15);
	setInterval(600);
	playMotion(MOTOR_CENTER,   0);
}

void turnRight()
{
	setInterval(200);
	playMotion(MOTOR_CENTER,  35);
	playMotion(MOTOR_LEFT,     0);
	playMotion(MOTOR_RIGHT,  -15);
	setInterval(600);
	playMotion(MOTOR_CENTER,   0);
	setInterval(200);
	playMotion(MOTOR_CENTER, -35);
	playMotion(MOTOR_RIGHT,    0);
	playMotion(MOTOR_LEFT,   -15);
	setInterval(600);
	playMotion(MOTOR_CENTER,   0);
}

void lookAround()
{
	setInterval(200);
	playMotion(MOTOR_CENTER, 0);
	playMotion(MOTOR_RIGHT,  0);
	playMotion(MOTOR_LEFT,   0);
	playMotion(MOTOR_NECK,   0);
	setInterval(300);
	playMotion(MOTOR_NECK,  60);
	playMotion(MOTOR_NECK,   0);
	playMotion(MOTOR_NECK, -60);
	playMotion(MOTOR_NECK,   0);
}

void homePosition()
{
	if (current_angle[MOTOR_CENTER] > 0) {
		playMotion(MOTOR_LEFT,   0);
	} else if (current_angle[MOTOR_CENTER] < 0) {
		playMotion(MOTOR_RIGHT,  0);
	}

	if (current_angle[MOTOR_LEFT] != 0) {
		playMotion(MOTOR_CENTER,  35);
		playMotion(MOTOR_LEFT,     0);
	}
	if (current_angle[MOTOR_RIGHT] != 0) {
		playMotion(MOTOR_CENTER, -35);
		playMotion(MOTOR_RIGHT,    0);
	}

	playMotion(MOTOR_CENTER, 0);
	playMotion(MOTOR_NECK,   0);

	setInterval(300);
}

void setup()
{
	Serial.begin(115200);

  initServo();
}

void loop()
{
	static int pos = 0;

	if(Serial.available()){
		char cmd = Serial.read();
		switch (cmd){
			case 'c': buf[0] = cmd; pos = 1; break;
			case 'r': buf[0] = cmd; pos = 1; break;
			case 'l': buf[0] = cmd; pos = 1; break;
			case 'n': buf[0] = cmd; pos = 1; break;
			case 'i': buf[0] = cmd; pos = 1; break;  // Interval(msec)
			case 0x0a:
				buf[pos] = 0x0;
				pos = 0;
				if (buf[1] == 't') {
					switch(buf[0]) {
						case 'c': setTrim(MOTOR_CENTER, atoi(&buf[2])); break;
						case 'r': setTrim(MOTOR_RIGHT,  atoi(&buf[2])); break;
						case 'l': setTrim(MOTOR_LEFT,   atoi(&buf[2])); break;
						case 'n': setTrim(MOTOR_NECK,   atoi(&buf[2])); break;
					}
				} else {
					switch (buf[0]) {
						case 'c': playMotion(MOTOR_CENTER, atoi(&buf[1])); break;
						case 'r': playMotion(MOTOR_RIGHT,  atoi(&buf[1])); break;
						case 'l': playMotion(MOTOR_LEFT,   atoi(&buf[1])); break;
						case 'n': playMotion(MOTOR_NECK,   atoi(&buf[1])); break;
						case 'i': setInterval(atoi(&buf[1]));              break;
						case 'F': moveForward();                           break;
						case 'B': moveBack();                              break;
						case 'L': turnLeft();                              break;
						case 'R': turnRight();                             break;
						case 'N': lookAround();                            break;
						case 'H': homePosition();                          break;
					}
				}
				break;
			default :
				if (pos < 15) {
					buf[pos] = cmd;
					pos++;
				} else {
					pos = 0;
				}
				 break;
		}
	}
	delay(10);
}

上記プログラミングでは、Servo Libraryを使用しています。

arduino-libraries/Servo

操作コマンド
F前進
B後退
L左回転
R右回転
N首振り
H正立
c整数値足を上げる
r整数値右足を回す
l整数値左足を回す
n整数値首を回す
i整数値動作間隔を指定する
ct整数値胸サーボのオフセット設定
rt整数値右足サーボのオフセット設定
lt整数値左足サーボのオフセット設定
nt整数値首サーボのオフセット設定

ESP8266によるTELNETプログラムは下記を参考にしてください。

TELNETサーマルプリンタ
 Raspberry Pi(ラズベリー パイ)は、ARMプロセッサを搭載したシングルボードコンピュータ。イギリスのラズベリーパイ財団によって開発されている。
2022.05.27 まずはロボットカーでお勉強
2022.06.10 第1回テスト環境構築
2022.07.02 第2回テレメトリ通信
2023.05.01 番外編 micro:bit磁気加速度センサ
2024.06.23 第3回 機体制御 雑談
2024.07.23 第4回 慣性センサ
2025.02.22 第5回 自作シリアル・プロポ
2025.03.10 簡易二足歩行ロボット


Arduinoで学ぶ組込みシステム入門(第2版)
●Arduinoを使って組込みシステム開発を理解する
・ハードウェアやソフトウェアなどの基礎知識/ ・設計から実装までを系統的に説明するモデルベース開発/ ・Arduinoを用いた実際の開発例

最新 使える! MATLAB 第3版
◆◆すぐに「使える!」 全ページフルカラー!◆◆
・MATLAB R2022bに対応し、解説もより詳しく!/ ・コマンド・スクリプトの例が豊富で、動かして学べる!/ ・超基本から解説。これから使いはじめる人にぴったり!/ ・全編フルカラー、スクリーンショットも豊富!

Amazon Web Services基礎からのネットワーク&サーバー構築改訂4版
1.システム構築をインフラから始めるには/ 2.ネットワークを構築する/ 3.サーバーを構築する/ 4.Webサーバーソフトをインストールする/ 5.HTTPの動きを確認する/ 6.プライベートサブネットを構築する/ 7.NATを構築する/ 8.DBを用いたブログシステムの構築/ 9.TCP/IPによる通信の仕組みを理解する

C言語は第二の母国語: 独学学生時代から企業内IT職人時代に培った、独立のための技術とノウハウ 平田豊著
学生時代から独学でプログラミングをはじめ、企業内でデバイスドライバを開発し、そして独立後もたくさんのアプリケーション開発や技術書制作に携わってきた著者。その筆者が大事に使い続ける「C言語」の“昔と今”について、気づいたことや役立つ知識、使ってきたツールなどについて、これまで記してきたことを整理してまとめました。 本書では、現役プログラマーだけでなく、これからプログラミングを学ぶ学生などにも有益な情報やノウハウを、筆者の経験を元に紹介しています。

1冊ですべて身につくJavaScript入門講座
・最初の一歩が踏み出せる! 初心者に寄り添うやさしい解説 ・最新の技術が身につく! 今のJavaScriptの書き方・使い方 ・絶対に知っておきたい! アニメーションとイベントの知識 ・プログラミングの基本から実装方法まですべて学べる

図解! Git & GitHubのツボとコツがゼッタイにわかる本
ソフトウェア開発では欠かすことのできないGit、GitHub。 これからGit、GitHubを使いたいという入門者の方でも、実際に手を動かしながら使い方を学べます。

C自作の鉄則!2023 (日経BPパソコンベストムック)
メーカー製のパソコンはスペックが中途半端で、自分が本当に欲しい機種がない――。そう思っている人には、ぜひ自作パソコンをお薦めします。自作パソコンのパーツは進化が速く、しかも驚くほど種類が豊富。価格も性能も、幅広く用意されているため、満足度100%の“自分だけの1台”を手に入れることができます。

Interface 2023年6月号
特集:第1部 フィルタ設計 基礎の基礎/ 第2部 係数アプリや波形観測アプリで合点!FIR&IIRフィルタ作り/ 第3部 配布プリント基板で体験!マイコンで動くフィルタ作り

日経Linux 2023年5月号
【特集 1】 AI時代の最強フリーソフト ~ 25のやりたいを実現! 【特集 2】 AWS、Azureのうまみを無料で体感!面倒なことはクラウドに任せよう 【特集 3】 新しいRaspberry Pi Cameraで遊んでみよう 【特集 4】 Linuxで旧型PCを復活! 1kg切るモバイルPCを「ChromeOS Flex」でChromebook化

ラズパイマガジン2022年秋号
特集:5大人気ボード 電子工作超入門
「半導体不足で在庫が不足し、電子工作のボードがなかなか買えない…」。そんな今にふさわしい特集を企画しました。5種の人気ボードにすべて対応した電子工作の入門特集です。「GPIO」や「I2C」を使った電子パーツの制御方法は、どのボードでも同じです。手に入れられたボードを使って、今こそ電子工作を始めましょう。

地方で稼ぐ! ITエンジニアのすすめ
学歴、理系の知識、専門スキル……全部なくてもITエンジニアになれる! 地方でも高収入でやりがいをもって働ける!ITエンジニアの魅力を一挙大公開

Raspberry Piのはじめ方2022
本書は、ラズパイやPicoの買い方やインストール、初期設定といった基本から、サーバー、電子工作、IoT、AIといったラズパイならではの活用方法まで、1冊でお届けします。 ラズパイをこれから始める方向けに、全36ページの入門マンガ「女子高生とラズベリーパイ」も巻末に掲載。これを読むだけでラズパイがどんなものなのか、すぐに分かって触れるようになります。

ハッカーの学校 IoTハッキングの教科書
生活にとけこみ、家電機器を便利にするIoT技術。 Webカメラなど、便利の裏側に潜むセキュリティの危険性をハッキングで検証。 専門家がパケットキャプチャからハードウェアハッキングまで、その攻撃と防御を徹底解説。 本書は2018年7月に刊行された「ハッカーの学校IoTハッキングの教科書」に一部修正を加えた第2版です。

攻撃手法を学んで防御せよ! 押さえておくべきIoTハッキング
本書は、経済産業省から2021年4月にリリースされた、IoTセキュリティを対象とした『機器のサイバーセキュリティ確保のためのセキュリティ検証の手引き』の『別冊2 機器メーカに向けた脅威分析及びセキュリティ検証の解説書』をもとに、IoT機器の開発者や品質保証の担当者が、攻撃者の視点に立ってセキュリティ検証を実践するための手法を、事例とともに詳細に解説しました。

ポチらせる文章術
販売サイト・ネット広告・メルマガ・ブログ・ホームページ・SNS… 全WEB媒体で効果バツグン! カリスマコピーライターが教える「見てもらう」「買ってもらう」「共感してもらう」すべてに効くネット文章術

プログラマーは世界をどう見ているのか 西村博之著
イーロン・マスク(テスラ)、ジェフ・べゾス(Amazon)、ラリー・ペイジ(Google)…etc. 世界のトップはなぜプログラマーなのか?

ニーア オートマタ PLAY ARTS改 <ヨルハ 二号 B型 DX版> PVC製 塗装済み可動フィギュア
「NieR:Automata」より、ヨルハ二号B型こと2BがPLAY ARTS改に新たに登場! 高級感の感じられるコスチュームや髪の質感、洗練されたボディバランス、細かなデティールに至るまでこだわり抜かれた逸品。 DX版には通常版のラインナップに加え2Bの随行支援ユニット ポッド042などをはじめ“純白の美しい太刀"白の約定やエフェクトパーツ、自爆モードを再現できる換装用ボディパーツ、シーンに合わせて変えられる顔パーツ2種も付属する豪華な仕様に。 作中のあらゆるシーンを再現することが可能なファン必見の一品となっている。

Newtonライト2.0 ベイズ統計
ベイズ統計は,結果から原因を推定する統計学です。AIや医療などの幅広い分野で応用されています。その基礎となるのは18世紀に考えだされた「ベイズの定理」です。 この本では,ベイズ統計学のきほんをやさしく紹介していきます。

白光(HAKKO) ダイヤル式温度制御はんだ吸取器 ハンディタイプ FR301-81


無水エタノールP 500mlx2個パック(掃除)


ケイバ(KEIBA) マイクロニッパー MN-A04


サンハヤト SAD-101 ニューブレッドボード


白光(HAKKO) HEXSOL 巻はんだ 精密プリント基板用 150g FS402-02


[Amazon限定ブランド]【指定第2類医薬品】PHARMA CHOICE 解熱鎮痛薬 解熱鎮痛錠IP 100錠


Copyright © 2011-2024 Sarako Tsukiyono All rights reserved®.