質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

Q&A

0回答

2035閲覧

arduinoで車を走らせる

1236

総合スコア19

Arduino

Arduinoは、AVRマイコン、単純なI/O(入出力)ポートを備えた基板、C言語を元としたArduinoのプログラム言語と、それを実装した統合開発環境から構成されたシステムです。

0グッド

1クリップ

投稿2020/01/15 06:21

編集2022/01/12 10:55

前提・実現したいこと

arduino unoを用いて、車を走らせています。操作方法はスマホから音を出して、その周波数で直進や右折など制御しています。実際に走らせると動きがカクカクしてしまいます。滑らかに走らせるにはどうしたらよいでしょうか?原因はdelayの位置や値のような気がするのですが色々変えてみても改善しません。ハードの問題もあるかもしれませんが、プログラムで改善すべきところがあれば教えてください。

該当のソースコード

Arduino

1 2#define motorA1 6 3#define motorA2 7 4#define motorB1 11 5#define motorB2 12 6#define pwm1 9 7#define pwm2 10 8 9#include "arduinoFFT.h" 10 11#define SAMPLES 128 //Must be a power of 2 12#define SAMPLING_FREQUENCY 10000 //Hz, must be less than 10000 due to ADC 13 14arduinoFFT FFT = arduinoFFT(); 15 16unsigned int sampling_period_us; 17unsigned long microseconds; 18 19double vReal[SAMPLES]; 20double vImag[SAMPLES]; 21 22void setup() { 23 Serial.begin(115200); 24 pinMode(motorA1,OUTPUT); 25 pinMode(motorA2,OUTPUT); 26 pinMode(motorB1,OUTPUT); 27 pinMode(motorB2,OUTPUT); 28 29 sampling_period_us = round(1000000*(1.0/SAMPLING_FREQUENCY)); 30} 31 32void loop() { 33 34 /*SAMPLING*/ 35 for(int i=0; i<SAMPLES; i++) 36 { 37 microseconds = micros(); //Overflows after around 70 minutes! 38 39 vReal[i] = analogRead(0); 40 vImag[i] = 0; 41 42 while(micros() < (microseconds + sampling_period_us)){ 43 } 44 } 45 46 /*FFT*/ 47 FFT.Windowing(vReal, SAMPLES, FFT_WIN_TYP_HAMMING, FFT_FORWARD); 48 FFT.Compute(vReal, vImag, SAMPLES, FFT_FORWARD); 49 FFT.ComplexToMagnitude(vReal, vImag, SAMPLES); 50 double frq = FFT.MajorPeak(vReal, SAMPLES, SAMPLING_FREQUENCY); 51 52 /*PRINT RESULTS*/ 53 Serial.println(frq); //Print out what frequency is the most dominant. 54 55 for(int i=2; i<(SAMPLES/2); i++) 56 { 57 /*View all these three lines in serial terminal to see which frequencies has which amplitudes*/ 58 59 //Serial.print((i * 1.0 * SAMPLING_FREQUENCY) / SAMPLES, 1); 60 //Serial.print(" "); 61 //Serial.println(vReal[i], 1); //View only this line in serial plotter to visualize the bins 62 } 63 64 //delay(100); //Repeat the process every second OR: 65 //while(1); //Run code once 66 67 if(frq < 2000){ //停止 2000以下 68 analogWrite(pwm1, 0); 69 digitalWrite(motorB1,LOW); 70 digitalWrite(motorB2,LOW); 71 analogWrite(pwm2, 0); 72 digitalWrite(motorA1,LOW); 73 digitalWrite(motorA2,LOW); 74 } 75 76 else if(2000<=frq && frq<2700){//直進 2000 77 digitalWrite(motorB2,LOW); 78 digitalWrite(motorB1,HIGH); 79 analogWrite(pwm1,255); 80 digitalWrite(motorA2,LOW); 81 digitalWrite(motorA1,HIGH); 82 analogWrite(pwm2, 255); 83 } 84 85 else if(2700 <= frq && frq < 3200){ //右折 2400 86 analogWrite(pwm1, 200); 87 digitalWrite(motorB1,HIGH); 88 digitalWrite(motorB2,LOW); 89 analogWrite(pwm2, 80); 90 digitalWrite(motorA1,HIGH); 91 digitalWrite(motorA2,LOW); 92 } 93 94 else if(3200 <= frq && frq < 3800){//左折 2800 95 analogWrite(pwm1, 80); 96 digitalWrite(motorB1,HIGH); 97 digitalWrite(motorB2,LOW); 98 analogWrite(pwm2, 200); 99 digitalWrite(motorA1,HIGH); 100 digitalWrite(motorA2,LOW); 101 } 102 103 else if(3800 <= frq ){//後退  3200 104 analogWrite(pwm1,100); 105 digitalWrite(motorB1,LOW); 106 digitalWrite(motorB2,HIGH); 107 analogWrite(pwm2, 100); 108 digitalWrite(motorA1,LOW); 109 digitalWrite(motorA2,HIGH); 110 } 111 112 delay(100); 113}

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jimbe

2020/01/15 06:43

> 苦手なので少しでも手を貸していただけるとありがたい 各種資料から作成したコードが資料通りに動作しない等でお困りであれば, そのコードと共に各資料・情報・現象をご提示ください. 「こうしたい」だけでは人に頼っているだけに見えてしまいます. 現在習っているのであれば, ご友人や先輩・講師らに相談しては如何でしょうか.
coco_bauer

2020/01/20 10:02

コードを見ると、直進、右折、左折、後退、停止、しか動作のレパートリーが無いので、カクカクした動作にしかなりません。 自分が自転車に乗っていると思ってください。直進している時に、ハンドルを急に右に45度まで曲げたら何が起きるか想像できますか?ハンドルの操作はゆるやかに、急ブレーキ、急ハンドルなど「急」のつく操作をしないことが、スムーズな運転につながります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問