FutabaサーボをRaspberry Piにつなぐ2

Raspberry Pi

秋ですね。
秋と言えば食欲の秋。

私は最近ポップコーンがマイブームでやめられません。
いろいろこだわりがあって、バターとかしょうゆとかじゃなく、塩味だけのがよいのですがなかなか出来合いの袋入りのが売ってないのです。
コンビニ系とかのも買いあさったのですが、全部だめで、結局自分で炒ってる始末。
最近はポップコーンを作る人もあまりいないらしく、最寄のスーパーではもう取り扱ってないと言われたり、いつもは150gのしか買えないのですが、たまたまスーパーで見つけた1kgのポップコーンの豆袋(?)※を買ってしまいました。
※豆と書いたのは、豆売り場にポップコーンの1kg入り袋を売ってたからです。

さて、先週は、Futabaサーボを動かすモジュールを作りました。

そういえば。
よくよく調べたら、Futabaサーボは3.3Vの信号で動いていることが判明。
Futabaサーボのほうは5Vトレラントなので、入力信号は3.3Vでも5Vでも大丈夫のようですが、出力信号は3.3Vでした。したがって、RPiには、そのままRxに入れて大丈夫です。

それではいよいよ、これらのモジュールを呼び出して動かしてみましょう。

使用するのはたったこれだけです。

//サーボIDをデフォルトの1に設定。自分のサーボIDが違う人はここで設定
#define ID_SERVO1 1

//トルクをオン
servo_torque_set(fd, ID_SERVO1, ON);

//サーボを指定角度まで移動
move_target_degree(fd, ID_SERVO1, 90.0);
sleep(1);
move_target_degree(fd, ID_SERVO1, -90.0);
sleep(2);
move_target_degree(fd, ID_SERVO1, 0);
sleep(1);

//トルクをオフ
servo_torque_set(fd, ID_SERVO1, OFF);

では、動かしてみましょう。おもむろに下記のようにコンパイルしてください。

$ cc –o futaba main.c

そして、実行

$ sudo ./futaba

サーボが90度、反対の90度、真ん中に戻るという動作で動きましたね?
sleep(1)とかsleep(2)とかあるのは、サーボが動ききる時間を勘案して、その間はほかの動作がはいらないようにしています。(sleepなしでどんどんコマンド送ると動かないことがあります。)

動かなかった方、ハードウェアの設定や回路をチェックしてください。
このソースは動作確認済みなので、動いていないということはハードに問題があります。
チェックポイントは次のとおりです。

1. Raspberry Piのポートがデフォルトのままではありませんか?
2. Futabaサーボは電源投入されていますか?
3. Futabaサーボの回路は正しいですか?

皆さん、動きましたか?
動いてない方は引き続き、ハードウェアのデバッグをしてください。

動いた方は、プログラムのクロージングをするために使ったシリアルポートの後始末をします。
最初のシリアル通信ポートをあけたときに前の設定を残してありましたね。
自分しか使わないので、ポートの設定を戻さなくてもいいかなと思ったりもしますが、よい子の皆さんは使ったら元に戻すと教えられている方が多いと思うので、奥ゆかしく設定を元に戻しておきます。

私は自分専用のハードの場合は設定を戻さずにそのままシリアルポートを閉じているので、いきなりclose(fd)と書いてもまったく問題ないです。(たぶん)

    ioctl(fd, TCSETS, &oldtio);       /* ポートの設定を元に戻す */
    close(fd);                        /* デバイスのクローズ */

これで、一連の双葉サーボを動かす、の巻が終わりです。
次は読み取りが書けたらいいかな。時間があるかな。
がんばってみます。

全ソースはこちら!

//////////////////////////////////////////////////////////////////////////
//  Futaba servo controller for Raspberry Pi for blog Ver.1 (c)2013		//
//                                                                  	//
//  By Y.Nakagawa RT Corporation, 			                			//
//                                                                  	//
//////////////////////////////////////////////////////////////////////////

#include<stdio.h>
#include<stdlib.h>
#include<strings.h>

#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
//サーボIDをデフォルトの1に設定。自分のサーボIDが違う人はここで設定
#define ID_SERVO1 1

//Raspberry Piのポート設定
#define SERIAL_PORT "/dev/ttyAMA0"  
#define BAUDRATE B115200 //Futabaサーボのデフォルトの通信レート(bps)

int main(int argc, char *argv[])
{
	int fd; //シリアルポートのファイルデスクリプタ
	char *com;
	struct termios newtio, oldtio;    //ターミナルの設定
	    
	if(!(fd = open(SERIAL_PORT, O_RDWR))) return -1;  //シリアルポートを開く
	ioctl(fd, TCGETS, &oldtio);       //ターミナルの設定を読み込む(現在の設定を保存)

	bzero(&newtio, sizeof(newtio));	//ターミナルの設定用にメモリを確保
	newtio = oldtio;                  //ターミナルの現在設定をコピー
	newtio.c_cflag = (BAUDRATE | CS8 | CLOCAL | CREAD); //ボーレート等を設定
	newtio.c_iflag = (IGNPAR | ICRNL);
	newtio.c_oflag = 0;
	newtio.c_lflag = ICANON; //カノニカルモードで起動

    ioctl(fd, TCSETS, &newtio);       //ターミナルの設定を書き込み

	//トルクをオン
	servo_torque_set(fd, ID_SERVO1, ON);

	//サーボを指定角度まで移動
	move_target_degree(fd, ID_SERVO1, 90.0);
	sleep(1);
	move_target_degree(fd, ID_SERVO1, -90.0);
	sleep(2);
	move_target_degree(fd, ID_SERVO1, 0);
	sleep(1);

	//トルクをオフ
	servo_torque_set(fd, ID_SERVO1, OFF);

    ioctl(fd, TCSETS, &oldtio);       //ターミナルの設定を元に戻しておく
    close(fd);                        //シリアルポートを閉じる

    return 0; //終了
}

Raspberry Pi、アールティでもお高いですが、購入できるようになりました。
ぜひご購入ください。


Raspberry pi TypeB 512MB
このブログで使ってるのはこれ

RPiをマイクロSDで使うためのアダプタ。これは出っ張りが少なくなるので便利。w

タイトルとURLをコピーしました