• 締切済み

押したら動くプログラム

プログラミング初心者なのです。 タッチセンサーを押したら、ライトセンサーの下に置いてある物の色(黒か白か)を判別して右に流すか左に流すようなプログラムを考えているのですが、流れとしてはこんな感じでいいのでしょうか? while(gettouch(CH_2)==0);  ボタンが押されるまで待つ  if(gettouch(CH_2)==1){   ボタンが押されたら   if(getsensor(CH_3)>5){   ライトセンサーの値が5よりも大きかったら    motorpower(CH_A,10);  モーターパワーを10    sieep(3);           3秒待つ    motorpower(CH_A,0);   モーターパワーを0   }else{    motorpower(CH_A,-10); モーターパワーを-10    sieep(3);           3秒待つ    motorpower(CH_A,0);   モーターパワーを0   } } 上記のようなプログラムで動くでしょうか? もし足りないところなどあったらご指摘いただけると幸いです。

みんなの回答

回答No.1

ハードがなんなのか、処理系がなんなのかわからないから、 その環境で動かしてみたら?としか言えないよ。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • スイッチのソースの書き方について

    ライントレースのタッチセンサー1つを使ってON/OFFができるようにしたいのですが 下記のソースだとライントレースをしていて、黒いラインの上にいるときにしかON/OFFできません。 これを白い部分(ラインから外れたところ)でもスイッチがきくようにするにはどのようにすればいいでしょうか? /* ライトセンサーの判定値 */ #define kuro 10 /* Touch Sensor control */ /* タッチセンサーの状態を判断 戻り値 0:タッチセンサーが押されていない 1:タッチセンサーが押されている */ int GetTouch(unsigned char ch) { if (pAnalog->Pin6[ch][pAnalog->Actual[ch]] > 1000) { return 1; } else { return 0; } } int migi(unsigned char ch) /*右まわり*/ { MotorPower(CH_C, -20); /* 出力ポートCのパワーを-20%(逆回転)に変更 */ MotorPower(CH_B, 40); /* 出力ポートBのパワーを10%(逆回転)に変更 */ return 0; } int hidari(unsigned char ch)/*左まわり*/ { MotorPower(CH_C, 40); /* 出力ポートCのパワーを10%(逆回転)に変更 */ MotorPower(CH_B, -20); /* 出力ポートBのパワーを-20%(逆回転)に変更 */ return 1; } int mae(unsigned char ch) /*前進*/ { MotorPower(CH_C,45 ); /* 出力ポートCのパワーを10%(逆回転)に変更 */ MotorPower(CH_B,40 ); /* 出力ポートBのパワーを-20%(逆回転)に変更 */ return 1; } /* Light Sensor control */ /* ライトセンサーの値を取得 */ unsigned char GetSensor(unsigned char ch) { return((unsigned char)pUart->Raw[ch][pUart->Actual[ch]][0]); } int main(void) { int R = 0; MotorReset(CH_B|CH_C); /* モーターの状態をリセット */ MotorStart(CH_B|CH_C); /* モーター起動 */ while(1) { /* 永久ループ */ if(GetTouch(CH_2) == 1){ while(GetTouch(CH_2) == 0); MotorPower(CH_B|CH_C, 0); /*出力ポートB,Cのパワーを0にする*/ while(GetTouch(CH_2) == 1); /* はなされるまで待つ */ while(GetTouch(CH_2) == 0); /*押されるまで待つ*/ MotorPower(CH_B|CH_C, 40); /*出力ポートB,Cのパワーを50、50にする*/ while(GetTouch(CH_2) == 1); } clock_t start,end; if (GetSensor(CH_3) > kuro ){ /* 入力ポート3のライトセンサーが設定値を超えている場合…*/ start = clock(); /*時間測定スタート(ここから)*/ if( R == 1 ){ migi(CH_B|CH_C); /*右回り*/ }else{ hidari(CH_B|CH_C); /*左回り*/ }//elseのカッコ }//ifのカッコ while(GetSensor(CH_3) > kuro){/* 入力ポート3のライトセンサーが設定値を超えている場合…*/ end = clock();/*時間測定終了(ここまで)*/ if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){ if( R == 1 ){ hidari(CH_B|CH_C); /*左回り*/ R = 0; while(GetSensor(CH_3) > kuro);/* 入力ポート3ライトセンサーが設定値を超えている場合は待つ*/ }else{ migi(CH_B|CH_C); /*右回り*/ R = 1; while(GetSensor(CH_3) > kuro);/* 入力ポート3ライトセンサーが設定値を超えている場合は待つ*/ }//elseのカッコ }//ifのカッコ }//whileのカッコ mae(CH_B|CH_C); /*前進する*/ }//whileのカッコ }//mainのカッコ

  • プログラムが始まりません

    以下のプログラムを書いたところ、コンパイルは出来たのですが 正しく動作するか動かしたところ、7行目のprintfも実行されませんでした。それより上の部分に不備があるのでしょうか。 何か基本的なことをなにか基本的なことを理解できてないのかもしれませんが、教えていただけませんでしょうか #include<stdio.h> int main(void) { FILE *fi; char fname[100], ss[255], *a, t, ch; int count, b, n, err, c[1000]; printf("file name?"); gets(fname); fi = fopen(fname,"r"); fgets(ss,255,fi); if(ss[0]!='P') err = 1; if(ss[1]!='3') err = 1; if(err ==1){ printf("file type is wrong\n"); exit(1); } while(count < 3){ *a = fgetc(fi); if(*a == 20){ count++; } } while(1){ *a = fgetc(fi); if(*a == EOF){ break; } if(*a == 20){ b++; } if(b == 3){ b = 0; t = *(a-1); if(t == '1'|| t == '3' ||t == '5' || t == '7'|| t == '9'){ c[n] = 1; } else{ c[n] = 2; } n++; } ++a; } n == 0; while(c[n] !=0){ count == 0; while(count < 8){ if(c[n] == 1){ ch++; } ch == ch + ch; count++; } printf("%c",ch); } fclose(fi); }

  • アルディーノのプログラムについて

    アルディーノのプログラムについてです。 アルディーノのプログラムについてです。 現在はトグルスイッチをON、センサーOFFでモーターが動きだし、センサーがONになるとそこからプラスで3.2秒モーターが動きその後停止し、またセンサーがOFFになるとモーターが動き出すと言うプログラムの動作を確認出来ています。この動作にモーターとセンサーをもう一つ加え、同じ動作をさせたいです。トグルスイッチは共通で、モーターの動きは対応しているセンサーによって独立させたいです。そこでプログラムを作ったのですが、このプログラムだと片方ずつしかモーターが動きません uint32_t time=3201; byte dir=2; byte pul=3; byte dir2=8; byte pul2=9; byte tgl_sw=6; byte sensor=7; byte sensor2=10; word wait_us=2500 ;//2500us*2*200→フルステップで約1RPS void setup() { pinMode(dir,OUTPUT); pinMode(pul,OUTPUT); digitalWrite(dir,HIGH); pinMode(dir2,OUTPUT); pinMode(pul2,OUTPUT);// digitalWrite(dir2,HIGH); pinMode(tgl_sw,INPUT_PULLUP);//※LOWでON pinMode(sensor,INPUT); pinMode(sensor2,INPUT);//※ } } void loop() { if(digitalRead(tgl_sw)==LOW && digitalRead(sensor)==HIGH) delay(2000); time=millis(); while(millis()-time<3200) {//センサがオンになってから1500msまで if(digitalRead(tgl_sw))return; digitalWrite(pul,HIGH);//回す delayMicroseconds(wait_us); digitalWrite(pul,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor)==HIGH)time=millis();//センサがオフなら更新 } {if(digitalRead(tgl_sw)==LOW && digitalRead(sensor2)==HIGH) delay(2000); time=millis(); while(millis()-time<3200) {//センサがオンになってから1500msまで if(digitalRead(tgl_sw))return; digitalWrite(pul2,HIGH);//回す delayMicroseconds(wait_us); digitalWrite(pul2,LOW); delayMicroseconds(wait_us); if(digitalRead(sensor2)==HIGH)time=millis();//センサがオフなら更新 //停止 } } } 修正点を教えていただけるとありがたいです。よろしくお願いします。

  • プログラムのソート

    "英語のテキストを読みこんで、出現する文字数のカウントをする"というプログラムを作成しました。このプログラムの出力を出現頻度順(大きい順)に並べ換えたいのですが、どの位置からソートを開始して、関数をどうすればいいのかがよく解りません。どなたかご教授下さい。 ↓取り敢えず、出来たプログラムを載せておきます。 #include<stdio.h> int main(int argc,char *argv[]) { int ch; // 小文字用 int CH; // 大文字用 int a; // str[CH]+str[ch] FILE *fp; int str[128]={0}; fp = fopen(argv[1],"r"); if(fp == NULL){ printf("I can't find it. You need to write a file name ! \n"); exit(1); }else{ printf("指定されたファイル '%s' 内の各文字の個数は以下の通り. \n",argv[1]); while((ch=fgetc(fp)) != EOF){ if(ch < 128) str[ch]++; } for(ch=0; ch<128; ch++){ if(str[ch] != 0){ if(ch>=65 && ch<=90 || ch>=97 && ch<=122){ // A~Z, a~z if(ch>=97 && ch<=122){ // a~z CH = toupper(ch); // 小文字を大文字に a = str[CH]+str[ch]; printf(" (%c)%5d (%c)%5d (%c+%c)%5d \n",CH,str[CH],ch,str[ch],CH,ch,a); } } } } fclose(fp); } return 0; }

  • プログラムの組み合わせ

    一つ目 #include <Servo.h> #define PBS1 10 #define analogPin 0 Servo RCservo1; void setup() { RCservo1.attach(7); pinMode(PBS1,INPUT); } void loop() { int s1 = digitalRead(PBS1); if(s1 == LOW) { while(1) { RCservo1.write(90); delay(1000); RCservo1.write(140); delay(1000); RCservo1.write(40); delay(1000); RCservo1.write(180); delay(1000); RCservo1.write(0); delay(1000); RCservo1.write(180); delay(1000); RCservo1.write(30); break; } } } 二つ目 int Duration; float Distance; const int TRIG = 10; const int ECHO = 12; const int BEAT = 300; const int SPK = 2; void setup() { Serial.begin(9600); pinMode(TRIG,OUTPUT); pinMode(ECHO,INPUT); } void loop() { digitalWrite(TRIG,LOW); delayMicroseconds(10); digitalWrite(TRIG,HIGH); delayMicroseconds(10); digitalWrite(TRIG,LOW); Duration = pulseIn(ECHO,HIGH); if (Duration > 0) { Distance = Duration /2; Distance = Distance * 0.034; Serial.print(Distance); Serial.print("cm"); } if(Distance < 5) { tone(SPK, 523, BEAT); Serial.println("[C]"); }else if (Distance >= 5&& Distance < 10){ tone(SPK, 494, BEAT); Serial.println("[B]"); }else if (Distance >= 10&& Distance < 15){ tone(SPK, 440, BEAT); Serial.println("[A]"); }else if (Distance >= 15&& Distance < 20){ tone(SPK, 392, BEAT); Serial.println("[G]"); }else if (Distance >= 20&& Distance < 25){ tone(SPK, 349, BEAT); Serial.println("[F]"); }else if (Distance >= 25&& Distance < 30){ tone(SPK, 330, BEAT); Serial.println("[E]"); }else if (Distance >=30&& Distance < 35){ tone(SPK, 294, BEAT); Serial.println("[D]"); }else if (Distance >= 35&& Distance < 40){ tone(SPK, 262, BEAT); Serial.println("[c]"); } delay(1000); } 一つ目はサーボモータを動かすプログラムで 二つ目は超音波センサによる距離に応じて音階が変わるプログラムです これらのプログラムを組み合わせて 距離に応じてサーボモータを動かすプログラムを作りたいです もしよろしければプログラムを教えてください

  • ライントレース 変数の使い方について

    プログラミングについておききしたいのですが、 ライントレースで左右のカーブを曲がる際に 変数を使って、「さっきは右に曲がったので次は右から曲がる」や 「さっきは左に曲がったから左から曲がる」といったプログラムは どのようにつくったらいいのでしょうか? まだ初心者なので変数をうまく使えなくて悩んでいます。 よろしくお願いします。 今のところ下記のような感じにできているのですが 修正点や加えた方がいい点、省略できる点はありますでしょうか? よろしくお願いします。 mainの上は省略させて頂きました。 int main(void) {  int R = 0; while(1) {  if(GetTouch(CH_2) == 1){//タッチスイッチでのON/OFFスイッチです  while(GetTouch(CH_2) == 0);  MotorPower(CH_B|CH_C, 0);  while(GetTouch(CH_2) == 1);  while(GetTouch(CH_2) == 0);  MotorPower(CH_B|CH_C, 40);  while(GetTouch(CH_2) == 1); }else{  //ここからライントレースの内容です  clock_t start,end;  clock_t start2,end2; if (GetSensor(CH_3) > kuro && R == 0) {  start = clock();  migi(CH_B|CH_C);  while(GetSensor(CH_3) > kuro){  end = clock();  start2 = clock(); if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){  hidari(CH_B|CH_C);  while(GetSensor(CH_3) > kuro);  end2 = clock();  MotorPower(CH_B|CH_C,40);  R = 1;  break; } while( R == 1 ){ if(GetSensor(CH_3) > kuro){ hidari(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); R = 0; break; }else { if(((double)(end2 - start2)/CLOCKS_PER_SEC)>0.2){ migi(CH_B|CH_C); while(GetSensor(CH_3) > kuro); MotorPower(CH_B|CH_C,40); }//ifのカッコ }//whileのカッコ }//elseのカッコ }//whileのカッコ }//ifのカッコ }//elseのカッコ }//whileのカッコ }//mainのカッコ

  • プログラム問題・・・

    今僕は、『if else』『while』『for』『switch』『配列(t[])』を知っているのですが、それで何かプログラムを作りたいのですが・・・思いつきません。 それを使ってできるプログラムが載っているサイトを教えてください。 それか、これらを使ってできる問題を言ってくれるだけでもけっこうです(それらだけでですよ!) 回答おねがいします。

  • 16進数の入力プログラムについて

    16進数の入力プログラムについての課題が出たのですが作動しませんどこが間違っているか教えて頂けませんか #include<stdio.h> main() { int number; int ch; printf("please input: "); while(){ ch=getchar() if('\n'=ch) break; number=number*16; if('0'<=ch && ch<='9'){ number=number+(ch-'0'); } if('A'<=ch && ch<='F'){ number=number+(ch-'A'+10); } } printf("your input number is %d\n",number,number); }

  • C++、10個の数のmin&maxを求めるプログラム

    C++でのプログラミングに関しての質問です。 ユーザーから与えられる10個の数のminとmax、averageを求めるプログラムを作らなければいけないのですが、if/elseで出す以外に方法はありますか? if/elseを使うとなると、かなりたくさん繰り返さなければいけないと思うので、もしもっと単純に求められるものがあれば、と思っています。 よろしくお願いします。

  • プログラミングに自信のある方是非解答をお願いします

    問題は以下です。 以下のプログラムは、整数の数式を入力して、式の値を求めて表示するプログラムである。このプログラムを発展させて、さらに高機能にせよ。(何をする機能を加えたかについての解説もお願いします。) #include <stdio.h> #include <stdlib.h> #include <ctype.h> static int ch; void error(char *s) { fprintf(stderr, "%s\n", s); exit(EXIT_FAILURE); } void nextch() { do { if ((ch = getchar()) == EOF) return; }while (ch == ' ' || ch == '\t'); } double number() { double x, a; int sign = '+'; if (ch == '+' || ch == '-') { sign = ch; nextch(); } if (! isdigit(ch)) error("Not a number or '(' is required."); x = ch - '0'; nextch(); while (isdigit(ch)) { x = 10 * x + ch - '0'; nextch(); } if (ch == '.') { a = 1; nextch(); while (isdigit(ch)) { x += (a /= 10) * (ch - '0'); nextch(); } } return sign == '-' ? -x : x; } double expression(); double factor() { double x; if (ch != '(') return number(); nextch(); x = expression(); if (ch != ')') error("')' is required,"); nextch(); return x; } double term() { double x, y; x = factor(); while (1) { if (ch == '*') { nextch(); x *= factor(); } else if (ch == '/') { nextch(); y = factor(); if (y == 0) error("Zero division"); x /= y; } else break; } return x; } double expression() { double x; x = term(); while (1) { if (ch == '+') { nextch(); x += term(); } else if (ch == '-') { nextch(); x -= term(); } else break; } return x; } int main() { double x; nextch(); x = expression(); if (ch != '\n') error("Syntax error"); printf("%g\n", x); return EXIT_SUCCESS; }