パソコンにCANボード(型式LPC-485120)を内蔵しDCモータ、EPOS 24/1 ドライバをそれぞれ二個使用し、ロボットを動かす(制御)したいのですがどのようなC言語プログラムを書けばいいのでしょうか?

まだ学生で初心者なんで詳しく教えて頂けたらありがたいです。

A 回答 (1件)

どうぞ。


http://www.kenschool.jp/Embedded_Linux/details/d …

デバイスは絞られているし、テーマは大きすぎるし、
C言語もどこまで理解しているかわからないし、
これでは多分、回答つかんでしょう。

少なくとも、この質問内容では、回答しきれないかと。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qサーボモータの制御

駄文で失礼いたします。

現在、二つのサーボモータ(一つは縦軸用、もう一つは横軸用)を動作させてペンを動かしているのですが、縦方向・横方向の移動はできるのですが、斜め移動が上手くいきません。
最終的には、ペンで曲線などを描きたいんですが、うまくプログラムできません。
プログラミングに詳しい方、ご教授頂けないでしょうか?
現状は、C言語でRS-232Cを通して信号を送っています。
お願い致します。

Aベストアンサー

斜めに描画できない、というのは縦軸を動かしたときの横軸の移動量を計算する方法が分からないんですね。

古典的な直線描画法に、DDAという方法があります。任意のx1,y1-x2,y2間を埋める座標を、整数演算だけで求める手法です。参考URLを見て下さい。

整数演算ではなく、浮動小数点で求めたいならもっと簡単です。
縦軸か横軸、どちらかを一定数(1座標ずつとか)ずらしながら、対応するもう一方の座標をsin()かcos()で求めます。
三角関数の基本ですから、xが分かればyを、yが分かればxを求めるのは簡単ですよね?
#wikipediaへのリンクも張っておきます。

円の描画も、三角関数で半径rから任意の角度(0-360まで)のxy座標を求めてプロットするだけですから、簡単です。

参考URL:http://homepage2.nifty.com/kasayan/basic/graphic2.htm, http://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E9%96%A2%E6%95%B0

斜めに描画できない、というのは縦軸を動かしたときの横軸の移動量を計算する方法が分からないんですね。

古典的な直線描画法に、DDAという方法があります。任意のx1,y1-x2,y2間を埋める座標を、整数演算だけで求める手法です。参考URLを見て下さい。

整数演算ではなく、浮動小数点で求めたいならもっと簡単です。
縦軸か横軸、どちらかを一定数(1座標ずつとか)ずらしながら、対応するもう一方の座標をsin()かcos()で求めます。
三角関数の基本ですから、xが分かればyを、yが分かればxを求めるのは簡単...続きを読む

Qモータの制御

//ステッピングモータの回転
//右に2回転、停止、左に1回転、停止これを3回繰り返す
//ITUO使用、フラグが立つのを待つ
//10msごとにモータに出力
//str_4.c
#include <3048f.h>

void ioinit(void)
{
PB.DDR = 0xff;
}

void ituinit(void)
{

ITUO.TCR.BIT.CCLR = 1;//カウンタクリア要因
ITUO.TCR.BIT.TPSC = 3;//タイマプリスケーラ 25MHz/8=3.125MHz
ITUO.GRA = 31249;//3.125MHz/31250=100Hz、10ms、100pps
ITUO.TIER.BIT.IMIEA = 0;//IMFAフラグによる割り込み禁止
}

void wait(void)//停止時間
{
Long t=200000;
while(t--);
}

int main(void)
{
int i = 3;//繰り返しカウンタ
int p;//回転パルス数
int md = 0x11;//モータ出力データ
ioinit();
ituinit();
PB.DR.BYTE = md;
wait();
ITU.TSTR.BIT.STR0 = 1;//タイマスタート
while(i--){
for(p=0;p<96;p++){//2回転
PB.DR.BYTE = md;
md <<= 1;//右回転
if(md == 0x110)//4回シフトしたかの判断
md = 0x11;//4回シフトで初期値に戻す
while(!ITU0.TSR.BIT.IMFA);//フラグが立つのを待つ
ITU0.TSR.BIT.IMFA = 0;//フラグクリア
}
wait();//少し停止
for(p=50;p>0;p--){//1回転、1パルス多くした
PB.DR.BYTE = md;
md >>= 1;//左回転
if(md == 0x08)//4回シフトしたかの判断
md = 0x88;//4回シフトで初期値に戻す
while(!ITU0.TSR.BIT.IMFA);//フラグが立つのを待つ
ITU0.TSR.BIT.IMFA = 0;//フラグクリア
}
wait();
}
PB.DR.BYTE = 0x00;//モータ励磁OFF
while(1);//ここでとまっている
}
このプログラムのフローチャートがわかりません。

//ステッピングモータの回転
//右に2回転、停止、左に1回転、停止これを3回繰り返す
//ITUO使用、フラグが立つのを待つ
//10msごとにモータに出力
//str_4.c
#include <3048f.h>

void ioinit(void)
{
PB.DDR = 0xff;
}

void ituinit(void)
{

ITUO.TCR.BIT.CCLR = 1;//カウンタクリア要因
ITUO.TCR.BIT.TPSC = 3;//タイマプリスケーラ 25MHz/8=3.125MHz
ITUO.GRA = 31249;//3.125MHz/31250=100Hz、10ms、100pps
ITUO.TIER.BIT.IMIEA = 0;//IMFAフラグによる割り込み禁止
}

void wait(void...続きを読む

Aベストアンサー

http://okwave.jp/qa3576919.html
上記URLでも回答しましたが、学校の課題でしょうか?

プログラム中のコメント文を順番通りに並べれば
フローチャートが完成します。

例えばプログラムの最後の部分は以下のようになります。

・4回シフトしたか?
 ・Yesなら4回シフトで初期値に戻す
・フラグが立つのを待つ
・フラグクリア
・50回繰り返し

課題の丸投げはあまりよくありませんので補足をお願いします。
何がわかっていて、何がわからないのですか?
・int
・for
・while
・>>=
などの文の内、どれがわからなくて
プログラムのどの部分がわかるかなどを補足してください

QAVRでサーボモータの制御プログラム

ATmega168を購入してWinAVRでプログラムを書いています。GWServoのS03T 2BBMGと書かれているサーボモーターを動かそうとしています。パルスを送ればいいのかなと思ってdelayと出力を使ってPWMしているのですがまったく制御できません。どういうプログラムを組めばいいのでしょうか?AVRに外部の発信子はつけていません。ATmega168に内蔵されている発振子でしています。というかそれでいいのでしょうか?ごちゃごちゃですが、何か動かすためのアドバイスをください。お願いします。

Aベストアンサー

こんにちは。まずは話を整理して、一つずつ解決していきいましょう。

> どういうプログラムを組めばいいのでしょうか?

GWServoは、RC用のサーボモータですよね。RCサーボモータの動作原理はすでにご存じだと思いますが、念のため。
【TekuRobo工作室/ソフトウェア編/ラジコンサーボモータを動かす】
http://homepage1.nifty.com/rikiya/software/112servo1.htm

> モータードライブ用の回路ということはトランジスタで電圧を上げるということでしょうか?

そういう意味ではないと思いますよ。回路図も上記リンク先を参照してください。ラジコンサーボモータの端子の並び方は(現在は)各社とも同じ並び方ですので、2番ピンに6V(5VでもOK)500mA程度を供給できるようにしましょう。ただ動かすだけなら電流はもっと少なくて良いでしょう。(トルクの大きなサーボだと、ロック時に平気で 1A程度食ったりしますが。)

> パルスを送ればいいのかなと思ってdelayと出力を使ってPWMしているのですが

delay使うのは悪いやり方です。というのは、今後RWSPさんがプログラムの処理内容を増やしていったときに、サーボモータを制御するPWM信号を正しいタイミングで生成できなくなるからです。具体的には、シリアル通信やボタンの押し下げ制御、複数のサーボモータを同時に制御するなど、処理内容が増えてくるとdelayを使ったのでは約20ms周期のサーボ制御信号時間を管理できなくなります。管理できなくなると、サーボモータが動作中に、ビビッ、ビビッ、と振動します。

時間を正確に管理するためには、ATmega168の内蔵周辺回路にあるタイマモジュール(8-bit Timer/Counter0 または 16-bit Timer/Counter1)を使用します。このモジュールの詳細はATmega168のハードウェアマニュアル
http://www.atmel.com/dyn/resources/prod_documents/doc2545.pdf
を参照してください。

こんにちは。まずは話を整理して、一つずつ解決していきいましょう。

> どういうプログラムを組めばいいのでしょうか?

GWServoは、RC用のサーボモータですよね。RCサーボモータの動作原理はすでにご存じだと思いますが、念のため。
【TekuRobo工作室/ソフトウェア編/ラジコンサーボモータを動かす】
http://homepage1.nifty.com/rikiya/software/112servo1.htm

> モータードライブ用の回路ということはトランジスタで電圧を上げるということでしょうか?

そういう意味ではないと思いますよ。回路...続きを読む

Qロボットを動かすための言語について ロボットをpythonで動かすことができると聞いたのですがそのた

ロボットを動かすための言語について

ロボットをpythonで動かすことができると聞いたのですがそのためには具体的にどのソフトを使うのがオススメでしょうか。また、ロボット開発においてではpythonのような高級言語と、C言語やアセンブリ言語のような低級言語ではどちらの方が良いのでしょうか。

Aベストアンサー

>なるほど、ありがとうございます。
>やっぱりpythonだけで書くのはきついのでしょうか。

そもそもロボットに積むCPUボードのプラットフォーム用の
pythonがないと話になりません。

ラズパイ+python+gpioライブラリ とかなら
ある程度いけるかもしれませんね(^-^;

Q組み込みアカデミー LEDを1個点灯のはずが2個点灯してしまいます

組み込みアカデミー第1回 LEDを1個点灯のはずが2個点灯してしまいます。
対象は付録の「NE-R8C/25」です。動作確認プログラムのslos.hwsを実行するとLED1と2が交互・同時点灯を繰り返し、正常に動作しています。
ところが以下のプログラムをC:\WorkSpace\step01\step01\step01.a30として実行してもLEDが2個点灯してしまいます。
プログラム中 LED1点灯のところがMOV.B #11111110b,p2でもLED1と2同時に点灯してしまいます。
指定されたsfr_r825.incファイルはc:\WorkSpase\STEP01\STEP01以下にコピーしています。

.INCLUDE sfr_r825.inc ;SFR定義ファイルのインクルード
.SECTION PROGRAM,CODE ;コードセクション
.ORG 0009000h
Start:
MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定
BCLR p2_0      ;LED1点灯 
BSET p2_1      ;LED2消灯
Loop:
JMP Loop
.SECTION FIXVECTOR,ROMDATA
.ORG 0FFFCh
Reset:
.LWORD Start|0FF000000h
.END

組み込みアカデミー第1回 LEDを1個点灯のはずが2個点灯してしまいます。
対象は付録の「NE-R8C/25」です。動作確認プログラムのslos.hwsを実行するとLED1と2が交互・同時点灯を繰り返し、正常に動作しています。
ところが以下のプログラムをC:\WorkSpace\step01\step01\step01.a30として実行してもLEDが2個点灯してしまいます。
プログラム中 LED1点灯のところがMOV.B #11111110b,p2でもLED1と2同時に点灯してしまいます。
指定されたsfr_r825.incファイルはc:\WorkSpase\STEP01\STEP01以下にコピーしていま...続きを読む

Aベストアンサー

 ポートの設定を全て入力にしてみましょう。
 LEDが消灯しなければ、このプログラム自体が走っていないと判断できます。
 モニタか何か他のプログラムで出力に設定したのであり、あなたのプログラムで出力にしたのではないと判断出来る訳です。

>MOV.B #11111111b,pd2 ;入出力ポートP2を出力ポートに設定


人気Q&Aランキング

おすすめ情報