/* ツクモデモロボNo2のプログラム 2005.9.23(c)AsakusaGiken #0 増=足ヒラ外側下/減=足ヒラ外側上 #1 増=足先右手側/減=足先左手側 #2 増=足ヒラ外側上/減=足ヒラ外側下 #3 増=足先右手側/減=足先左手側 #4 減=左手上げ 完全上げ=−45 完全下げ=+10 #5 減=左手閉じる 完全閉じ=−35 完全開く=+35 #6 減=右手下げ 完全上げ=+45 完全下げ=−10 #7 減=右手開く 完全閉じ=+35 完全開く=−35 コントローラ 足 ADC0 中心=625 下=928 上=28 ADC1 中心=664 右=192 左=967 右手 ADC4 中心=680 下=977 上=214 ADC5 中心=700 右=100 左=972 左手 ADC2 中心=675 下=920 上=231 ADC3 中心=696 右=225 左=952 */ #include /* IO関連 */ #include /* 割り込み関連 */ #include /* 割り込みベクタ関連 */ #include /* USART通信ライブラリのヘッダファイル */ char txb[10],rxb[10]; /* 通信用のバッファ(変数)を宣言 */ /* -----グローバル変数----- */ char phase = 0; /* フェーズを表す変数(PORTC操作用にも使うのでバイトサイズ) */ char ServoPos[8] = {94, 94, 94, 94, 94, 94, 94, 94}; /* サーボの位置を示す変数 */ char HomePos[8] = {88, 90, 90, 96, 94-14, 94, 90+10, 94}; /* ホームポジション */ int Status = 0; // 入力状態(なにか動作があった時には0に戻る。入力なしの場合++、1000を超えると脱力) int StepNo = 0; // 歩行状態 int RoopCnt = 0; // 入力無し状態のカウント(自動脱力用) /*-----mS間ウェイトする関数-----*/ void wait_ms(int msec) { int count; /* 繰り返し用カウンタ変数(for文で使用) */ TCCR2 |= (1< 7) { phase = 0; /* フェーズが7を超えたらフェーズ0に戻る */ } } /*-----歩行関係-----*/ void step0(void) { /* step0 */ ServoPos[0] = HomePos[0] + 0; ServoPos[1] = HomePos[1] + 20; ServoPos[2] = HomePos[2] + 0; ServoPos[3] = HomePos[3] + 20; } void step1(void) { /* step1 */ ServoPos[0] = HomePos[0] + 30; ServoPos[1] = HomePos[1] + 20; ServoPos[2] = HomePos[2] + 15; ServoPos[3] = HomePos[3] + 20; } void step2(void) { /* step2 */ ServoPos[0] = HomePos[0] + 15; ServoPos[1] = HomePos[1] - 20; ServoPos[2] = HomePos[2] + 15; ServoPos[3] = HomePos[3] - 20; } void step3(void) { /* step3 */ ServoPos[0] = HomePos[0] + 0; ServoPos[1] = HomePos[1] - 20; ServoPos[2] = HomePos[2] + 0; ServoPos[3] = HomePos[3] - 20; } void step4(void) { /* step4 */ ServoPos[0] = HomePos[0] - 15; ServoPos[1] = HomePos[1] - 20; ServoPos[2] = HomePos[2] - 30; ServoPos[3] = HomePos[3] - 20; } void step5(void) { /* step5 */ ServoPos[0] = HomePos[0] - 15; ServoPos[1] = HomePos[1] + 20; ServoPos[2] = HomePos[2] - 15; ServoPos[3] = HomePos[3] + 20; } void homeP(void) { ServoPos[0] = HomePos[0]; ServoPos[1] = HomePos[1]; ServoPos[2] = HomePos[2]; ServoPos[3] = HomePos[3]; ServoPos[4] = HomePos[4]; ServoPos[5] = HomePos[5]; ServoPos[6] = HomePos[6]; ServoPos[7] = HomePos[7]; } /*-----ADC読み取り(引数は読み取るピン番号0-7)-----*/ int readADC(unsigned char ADCno) { /* ↓変換チャンネルを設定 */ ADMUX = 0xC0 + ADCno; ADCSRA |= (1< 760) ServoPos[6] = HomePos[6] - (stick - 680)/10; // 右手下げの場合 else ServoPos[6] = HomePos[6]; // 中立位置の場合 stick = readADC(5); if (stick < 580) ServoPos[7] = HomePos[7] + (stick - 696)/20; // 右手開くの場合 else if (stick > 760) ServoPos[7] = HomePos[7] + (stick - 696)/10; // 右手閉るの場合 else ServoPos[7] = HomePos[7]; // 中立位置の場合 /* 左手判定 */ stick = readADC(2); if (stick < 580) ServoPos[4] = HomePos[4] + (stick - 680)/10; // 左手上げの場合 else if (stick > 740) ServoPos[4] = HomePos[4] + (stick - 680)/10; // 左手下げの場合 else ServoPos[4] = HomePos[4]; // 中立位置の場合 stick = readADC(3); if (stick < 580) ServoPos[5] = HomePos[5] + (stick - 696)/20; // 左手開くの場合 else if (stick > 760) ServoPos[5] = HomePos[5] + (stick - 696)/10; // 左手閉るの場合 else ServoPos[5] = HomePos[5]; // 中立位置の場合 wait_ms(200); // 手入力判定は200mS周期 } /* 歩行レバー前後を判定 */ stick = readADC(0); if (stick < 400) Go_Fw(); if (stick > 850) Go_Bw(); /* 歩行レバー左右を判定 */ stick = readADC(1); if (stick < 400) Go_Rt(); if (stick > 850) Go_Lt(); /* 入力状態チェック(移動入力無しで60回ループしたら脱力) */ if (Status == 0){ RoopCnt++; if (RoopCnt > 60){ TIMSK &= ~(1<