まとめ
あなたは2つのハブと各種のホイールが2つ必要です。私はアマゾンで入手可能な30 mm×40 mm×5 mmのOリングを使用しています。モーターを固定するには4本のM3×25 mmネジが必要で、1セットのホイールには2本の8−32×3/4インチネジが必要です。スパークファンから2つのモーター(2つのホビーモーターで5ドル)を入手する必要があります。
https://www.youtube.com/watch?v=ioGz1LwgC6o
コードの中の一部のインクルードがHTMLプロセッサを混乱させているようです。
/*
- ファイル: R06Main.c
- 著者:hmikelson
- 2018年9月4日午後6時11分に作成されました。
*/
含める
含める
含める
プラグマ設定 MCLRE=OFF,CP=OFF,WDTE=OFF,FOSC=INTOSC
定義 _XTAL_FREQ 16000000
未署名のchar sPORTA、sPORTC、pwmax=31;
void init()
{
・GPIOポートを設定する
TRISA = 0b110000000; //全ての出力を設定する
TRISC = 0b110001000; //ピン3を入力用に設定する
OSCCONbits.IRCF = 0b1111;
OSCCONbits.SCS = 0b00;
//OPTION_REG = 0b01111111; //グローバルで弱いプルアップを有効にする
//WPUC = 0b00001000; //1で弱いプルアップを有効にする。
・アナログ入力を設定する
ANSELCbits.ANSC3 = 1;
ADCON0 = 0b00011101; //チャネル(CHS4:0ビット6~2)、ADONビット1でアナログを有効にする
ADCON1bits.ADCS = 0b111; // クロック選択専用のオシレータ
ADCON1bits.ADNREF = 0; //ネガティブリファレンス
ADCON1bits.ADPREF = 0; //設定 + VDDで電圧を調整
ADCON1bits.ADFM = 1; //左寄せの書式
ADRESH = 0x00; //ADレジスターを初期化する
ADRESL = 0x00; // これは必要ないと思う。
』
void vdelay(int n)
{
整数 i;
(i=0;i<=n;i++)
{
__delay_us(100);
}
}
int read_v()
入力から電圧を読み取る
{
整数val、v1、v2;
__delay_ms(1);
ADCON0bits.GO_nDONE = 1;
while(ADCON0bits.GO_nDONE == 1);
v1 = ADRESH;
v2 = ADRESL;
val = (v1 << 8) + v2;
戻り値を返します。
}
ロボットを前に進める
void RobotFd(int time, unsigned char speed)
{
整数 i、j を宣言します。
(i=0;i<time;i++) のために
{
(j=0;j<pwmax;j++)
{
もし(j < speed)なら、
{
ポータ = 0b00111110; //
PORTC = 0b00010110; // ピン4で有効にする
vdelay(pwmax/speed);
}
それ以外の場合
{
ポータ = 0b00000110; 私はピン4にクロック出力があると思うが、それを無効にする方法がわからない。
PORTC = 0b00010010; // ピン4で有効にする
vdelay(pwmax/speed);
}
』
ロボットを後方に運転する
void RobotBk(int time, unsigned char speed)
{
整数 i、j を宣言します。
(i=0;i<time;i++) のために
{
(j=0;j<pwmax;j++)
{
もし(j < speed)なら、
{
PORTA = 0b00111101;
PORTC = 0b00010101;
vdelay(pwmax/speed);
}
それ以外の場合
{
PORTA = 0b00000101;
PORTC = 0b00010001;
vdelay(pwmax/speed);
}
』
void RobotRt(int time, unsigned char speed)
{
整数 i、j を宣言します。
(i=0;i<time;i++) のために
{
(j=0;j<pwmax;j++)
{
もし(j < speed)なら、
{
ポータ = 0b00111110;
PORTC = 0b00010101;
vdelay(pwmax/speed);
}
それ以外の場合
{
ポータ = 0b00000110;
PORTC = 0b00001001;
vdelay(pwmax/speed);
}
』
void RobotLt(int time, unsigned char speed)
{
整数 i、j を宣言します。
(i=0;i<time;i++) のために
{
(j=0;j<pwmax;j++)
{
もし(j < speed)なら、
{
PORTA = 0b00111101;
PORTC = 0b00110110;
vdelay(pwmax/speed);
}
それ以外の場合
{
PORTA = 0b00000101;
PORTC = 0b00001010;
vdelay(pwmax/speed);
}
』
void RobotSt(int time)
{
整数 i;
(i=0;i<time;i++) のために
{
PORTA = 0b00000100;
PORTC = 0b00001100;
__delay_ms(10);
}
』
void main()
{
整数型のrmode、rtime、volts、mt=31;
無符号の整数 rspeed、nactions=0;
init();
RobotFd(100,pwmax/2);
ロボットSt(1);
RobotRt(100,pwmax/2);
ロボットSt(1);
RobotBk(100,pwmax/2);
ロボットSt(1);
ロボットLt(100,pwmax/2);
ロボットSt(1);
while(1)
{
もし(nations > 0)ならば、
{
rmode=(rand() & 7) + 1;
なしions=nactions-1;
}
それ以外の場合
{
rmode = 0;
}
rtime = (rand() & 7) + 1;
rspeed = rand() & pwmax;
スイッチ (rmode)
{
ケース 1:
RobotFd(rtime <)
RobotSt(1);
ブレイク;
ケース 2:
ロボットBk(rtime)
ロボットSt(1);
ブレイク;
ケース 3:
RobotRt(rtime <)
RobotSt(1);
ブレイク;
ケース 4:
ロボット中隊長(残り時間)
ロボットSt(1);
ブレイク;
ケース 0:
ロボットSt(1);
ボルト = read_v();
もし(ボルトが50より大きければ)
{
国数 = 10;
//blink(volts);
}
ブレイク;
デフォルト:
ロボットSt(10);
ブレイク;
}
}
}
Etiketler
Model Kaynağı
