0 / クリップ
Arduino UNO はデフォルトで PWM をサポートしているため配線は非常に簡単です .
そのパルスを送信する周期を 20ms にしています. やりたいのは画が変わるのを止めたいことであって、ループを止めることじゃないはず。draw()を繰り返し実行する、というのはProcessingの動作の基礎構造だから、そこに手を入れるってのは余程のことだと思う。いわば、明かりを消すのに手元のスイッチじゃなくて発電所を止めちゃう、みたいな。(ちょっと大げさ) 投稿 2019/11/23 11:39
以下のコードでは、停止用スイッチを押すとsensors = 1 が送られ、if文の中のnoLoop()により画像の読み込みは停止します。しかし、もう片方の再開用スイッチを押した時に送られる値sensors = 2 で再開することができません。 返信. 1 / クリップ [Processing][Arduino][シリアル通信]超音波センターで取得した距離の値をProc... [Processing][Java][Arduino]超音波センサーの値をProcessingの描画... arduino、加速度センサでprocessing RGB cubeをコントロールする。, 回答
Arduinoに接続した2つのタクトスイッチから得たスイッチのON/OFFのデータをProcessingに送っています。2つのタクトスイッチをそれぞれ停止用、再開用として使いたいです。 Arduinoのリファレンス(analogWrite関数)によると、Arduino Uno3等のアナログ出力ピン(3,5,6,9,10,11ピン)の内3,9,10,11ピンは490HzなPWMを出力します(5,6ピンは980Hz)。490Hzは周期が約2msec。一方多くのサーボモータの信号線には20msecなPWMを送るのだそうです。という事は、analogWrite関数が作るPWMはサーボモータに与えるにも周期が短過ぎます。ま、実際これでどう … おそらくですが、これは正確に PWM を送信されていないのが原因で、毎回 20ms 待つようにしていますが、Serial の読み込み等の他の処理があり周期が毎回正確になっておらず、サーボモータが不安定な状態になっているのだと思います, 次に Servo ライブラリを使った制御を紹介しますが、結論から先に言うとライブラリを使った制御のほうが圧倒的に安定します とりあえず今回は PWM の仕組みも知りたかったの、独自の制御方式も試してみた感じです, では、次に Arduino がデフォルトで提供している Servo ライブラリを使って制御してみたいと思います, ソースもかなり簡潔になりました ブログを報告する, #include // ライブラリの読み込み, Servo servo0,servo1,servo2; // Servo型の変数は「servo0」~「servo2」とする, pinMode(11, OUTPUT); //ピン11を出力に設定(LモータIN1), pinMode(10, OUTPUT); //ピン10を出力に設定(LモータIN2), pinMode(9, OUTPUT); //ピン9を出力に設定(RモータIN1), pinMode(8, OUTPUT); //ピン8を出力に設定(RモータIN2), servo0.attach(4); // Servo型の変数は「servo0(θ)」をピン4に割り当てる, servo1.attach(5); // Servo型の変数は「servo1(α)」をピン5に割り当てる, servo2.attach(6); // Servo型の変数は「servo2(β)」をピン6に割り当てる, servo2.write(100); // サーボ出力。β角度は100°, digitalWrite(11, HIGH); //ピン11にHIGH(1)を出力, digitalWrite(10, LOW); //ピン10にLOW(0)を出力, ); // Servo型の変数は「servo1(α)」をピン4に割り当てる, servo0.attach(2); // Servo型の変数は「servo0(θ)」をピン2に割り当てる, servo1.attach(4); // Servo型の変数は「servo1(α)」をピン4に割り当てる, servo2.attach(7); // Servo型の変数は「servo2(β)」をピン7に割り当てる, analogWrite(3, i); //ピン3にアナログ値(0~255)を出力, analogWrite(3, i); //ピン3にアナログ値(255~0)を出力, analogWrite(9, i); //ピン9にアナログ値(0~255)を出力, analogWrite(9, i); //ピン9にアナログ値(255~0)を出力, pinMode(3, OUTPUT); //ピン3に出力設定(LED R), pinMode(5, OUTPUT); //ピン5に出力設定(LED L), pinMode(11, OUTPUT); //ピン11に出力設定(LモータIN1), pinMode(10, OUTPUT); //ピン10に出力設定(LモータIN2), pinMode(6, OUTPUT); //ピン6に出力設定(RモータIN1), pinMode(9, OUTPUT); //ピン9に出力設定(RモータIN2), analogWrite(5, i); //ピン5にアナログ値(0~255)を出力, analogWrite(5, i); //ピン5にアナログ値(255~0)を出力, void scope_drive(int deg0, int deg1, int deg2, int ms), Arduinoでロボットを作ってみました!【15】テーブルから落ちないロボットPart2, Arduinoでロボットを作ってみました!【14】テーブルから落ちないロボットPart1.
再度サーボモータを回したいときに attach しています, サーボモータを servo.write で回してからdetach するまでに 200ms の delay を入れています //DCモータ駆動 //前進 //Lモータ前進回転 analogWrite(11, 230); //ピン11にアナログ値 230を出力 analogWrite(10, 0); //ピン10にアナログ値 0を出力 //Rモータ前進回転 analogWrite(9, 255); //ピン9にアナログ値 255を出力 analogWrite(8, 0); //ピン8にアナログ値 0を出力 delay(4000); : //後進 //Lモータ後進回転 analogWrite(11, 0); analogWrite(10, 255); //Rモータ後進回転 analogWrite(9, 0); analogWrite(8, 255); delay(4000); 前進の直進性が改善されたために、後進の際に左側に曲がるのが目立ってきました。そこで、後進の際のRモータの回転を少し遅くしようと思い、, のXの値を小さくしていったのですが、動きに変化がありません。いろいろとXの値を変化していくと、, のみ(ピン番号の後ろに~がついているピン)で、PWM出力に対応していない8番ピンにanalogWriteを設定しても、扱いはdigitalWriteと同等になってしまうためのようです。, analogWrite(8, 128~255) → digitalWrite(8, HIGH), analogWrite(8, 0~127) → digitalWrite(8, LOW), PWM出力が可能なピン番号を意識しないで回路設計をしてしまいましたので、接続ピン番号を下表のように修正します。, 走行速度と瞳LEDの明るさとを可変にしたいと思いますので、モータードライバーとLEDとをPWM出力ピンにつなぎます。また、0, 1番ピンはシリアル通信用のピンなので、空けておくことにします。, //ARD-R01動作確認:analogWriteによる直線走行#include // ライブラリの読み込みServo servo0,servo1,servo2; // Servo型の変数は「servo0」~「servo2」とするvoid setup() //初期設定{ pinMode(11, OUTPUT); //ピン11を出力に設定(LモータIN1) pinMode(10, OUTPUT); //ピン10を出力に設定(LモータIN2) pinMode(6, OUTPUT); //ピン6を出力に設定(RモータIN1) pinMode(5, OUTPUT); //ピン5を出力に設定(RモータIN2) servo0.attach(2); // Servo型の変数は「servo0(θ)」をピン2に割り当てる servo1.attach(4); // Servo型の変数は「servo1(α)」をピン4に割り当てる servo2.attach(7); // Servo型の変数は「servo2(β)」をピン7に割り当てる}void loop() //メインの処理{// スコープを中立位置に移動 servo0.write(90); // サーボ出力。θ角度は90° servo1.write(80); // サーボ出力。α角度は80° servo2.write(100); // サーボ出力。β角度は100° delay(1000); // タイマ(1秒) //DCモータ駆動 //前進 //Lモータ前進回転 analogWrite(11, 233); //ピン11にアナログ値 233を出力 analogWrite(10, 0); //ピン10にアナログ値 0を出力 //Rモータ前進回転 analogWrite(6, 255); //ピン6にアナログ値 255を出力 analogWrite(5, 0); //ピン5にアナログ値 0を出力 delay(4000); //停止 digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); delay(5000); //後進 //Lモータ後進回転 analogWrite(11, 0); analogWrite(10, 255); //Rモータ後進回転 analogWrite(6, 0); analogWrite(5, 252); delay(4000); //停止 digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(6, LOW); digitalWrite(5, LOW); delay(5000); }, 後進に対してもanalogWriteが有効となり、前進、後進共に直進性が向上しました。, 瞳LEDの配線も PWM出力ピンに配線変更を行いましたので、明るさのコントロールができるか確認してみます。首を傾けて、瞳LEDの明るさを徐々に明るくし(0→255)、徐々に暗くする(255→0)動作を行ってみます。, //ARD-R01動作確認:LED明るさ調整#include // ライブラリの読み込みServo servo0,servo1,servo2; // Servo型の変数は「servo0」~「servo2」とするvoid setup() //初期設定{ pinMode(3, OUTPUT); //ピン3(LED R)に出力設定 pinMode(9, OUTPUT); //ピン9(LED L)に出力設定 servo0.attach(2); // Servo型の変数は「servo0(θ)」をピン2に割り当てる servo1.attach(4); // Servo型の変数は「servo1(α)」をピン4に割り当てる servo2.attach(7); // Servo型の変数は「servo2(β)」をピン7に割り当てる}void loop() //ループ{ // スコープを中立位置に移動 servo0.write(90); servo1.write(80); servo2.write(100); delay(2000); // 上を向いて首を右に傾け、右目をゆるやかに明るくした後暗くする servo1.write(20); servo2.write(30); delay(1000); int i; //iはint型変数 for(i=0; i<=255; i=i+1) { analogWrite(3, i); //ピン3にアナログ値(0~255)を出力 delay(10); //タイマ(10msec) } for(i=255; i>=0; i=i-1) { analogWrite(3, i); //ピン3にアナログ値(255~0)を出力 delay(10); //タイマ(10msec) } // 上を向いて首を左に傾け、左目をゆるやかに明るくした後暗くする servo1.write(20); servo2.write(170); delay(1000); for(i=0; i<=255; i=i+1) { analogWrite(9, i); //ピン9にアナログ値(0~255)を出力 delay(10); //タイマ(10msec) } for(i=255; i>=0; i=i-1) { analogWrite(9, i); //ピン9にアナログ値(255~0)を出力 delay(10); //タイマ(10msec) }}, 上を向いて首を右に傾け、右目をゆるやかに明るくした後暗くする動作は期待通りに実行されているのですが、上を向いて首を左に傾けた後の、左目の明るさコントロールができていません。原因を調べたところ、, ”いずれかのピンがattach()されると9番,10番ピンからのPWM出力ができなくなる”, のが仕様であることが分かりました。つまり、9番ピンに接続したLED LへはPWM出力ができないためにこのような動きになってしまいました。, RCサーボも動かそうとすると、PWM出力が可能なピンは、3, 5, 6, 11の4ピンのみとなります。瞳LEDの明るさコントロールは外せませんから、走行速度制御は後進時はあきらめて前進時のみとして、接続ピン番号を下表のように修正します。, //ARD-R01動作確認:LED明るさ調整#include // ライブラリの読み込みServo servo0,servo1,servo2; // Servo型の変数は「servo0」~「servo2」とするvoid setup() //初期設定{ pinMode(3, OUTPUT); //ピン3(LED R)に出力設定 pinMode(5, OUTPUT); //ピン5(LED L)に出力設定 servo0.attach(2); // Servo型の変数は「servo0(θ)」をピン2に割り当てる servo1.attach(4); // Servo型の変数は「servo1(α)」をピン4に割り当てる servo2.attach(7); // Servo型の変数は「servo2(β)」をピン7に割り当てる}void loop() //ループ{ // スコープを中立位置に移動 servo0.write(90); servo1.write(80); servo2.write(100); delay(2000); // 上を向いて首を右に傾け、右目をゆるやかに明るくした後暗くする servo1.write(20); servo2.write(30); delay(1000); int i; //iはint型変数 for(i=0; i<=255; i=i+1) { analogWrite(3, i); //ピン3にアナログ値(0~255)を出力 delay(10); //タイマ(10msec) } for(i=255; i>=0; i=i-1) { analogWrite(3, i); //ピン3にアナログ値(255~0)を出力 delay(10); //タイマ(10msec) } // 上を向いて首を左に傾け、左目をゆるやかに明るくした後暗くする servo1.write(20); servo2.write(170); delay(1000); for(i=0; i<=255; i=i+1) { analogWrite(5, i); //ピン5にアナログ値(0~255)を出力 delay(10); //タイマ(10msec) } for(i=255; i>=0; i=i-1) { analogWrite(5, i); //ピン5にアナログ値(255~0)を出力 delay(10); //タイマ(10msec) }}, DCモータの速度制御とLEDの明るさ制御をトータルで確認するために、8の字走行試験を行います。今回のスケッチでは、関数の定義やRCサーボを駆動する際に、動かしたらservo.detach()することで、停止時に「ジジ」とか「カリ」と鳴いたり、時々震えるような現象を抑えることも試みます。, 時計回りに一定の半径を保って走り、中間位置で停止、首を振って瞳LEDの明るさを変化させ、反時計回りに一定の半径を保って走るという動作を行います。, //ARD-R01動作確認:8の字走行試験#include // ライブラリの読み込みServo servo0,servo1,servo2; // Servo型の変数は「servo0」~「servo2」とするvoid setup() //初期設定{ pinMode(3, OUTPUT); //ピン3に出力設定(LED R) pinMode(5, OUTPUT); //ピン5に出力設定(LED L) pinMode(11, OUTPUT); //ピン11に出力設定(LモータIN1) pinMode(10, OUTPUT); //ピン10に出力設定(LモータIN2) pinMode(6, OUTPUT); //ピン6に出力設定(RモータIN1) pinMode(9, OUTPUT); //ピン9に出力設定(RモータIN2) servo0.attach(2); // Servo型の変数は「servo0(θ)」をピン2に割り当てる servo1.attach(4); // Servo型の変数は「servo1(α)」をピン4に割り当てる servo2.attach(7); // Servo型の変数は「servo2(β)」をピン7に割り当てる}void loop() //ループ{ //停止 move_stop(5000); // スコープを中立位置に移動 scope_np(2000); // 時計回り走行 move_straight(500); move_curve(255, 50, 8000); move_straight(500); move_stop(2000); // 上を向いて首を右に傾け、右目をゆるやかに明るくした後暗くする scope_drive(80, 20, 30, 1000); int i; //iはint型変数 for(i=0; i<=255; i=i+1) { analogWrite(3, i); //ピン3にアナログ値(0~255)を出力 delay(10); //タイマ(10msec) } for(i=255; i>=0; i=i-1) { analogWrite(3, i); //ピン3にアナログ値(255~0)を出力 delay(10); //タイマ(10msec) } // 上を向いて首を左に傾け、左目をゆるやかに明るくした後暗くする scope_drive(110, 20, 170, 1000); for(i=0; i<=255; i=i+1) { analogWrite(5, i); //ピン5にアナログ値(0~255)を出力 delay(10); //タイマ(10msec) } for(i=255; i>=0; i=i-1) { analogWrite(5, i); //ピン5にアナログ値(255~0)を出力 delay(10); //タイマ(10msec) } //反時計回り走行 move_straight(500); move_curve(65, 255, 9000); move_straight(500); move_stop(2000);}//関数の定義//前進(直進)void move_straight(int ms){ analogWrite(11, 233); digitalWrite(10, LOW); analogWrite(6, 255); digitalWrite(9, LOW); delay(ms); }//前進(曲線走行)void move_curve(int MLS, int MRS, int ms){ analogWrite(11, MLS); digitalWrite(10, LOW); analogWrite(6, MRS); digitalWrite(9, LOW); delay(ms); }//後進void move_back(int ms){ digitalWrite(11, LOW); digitalWrite(10, HIGH); digitalWrite(6, LOW); digitalWrite(9, HIGH); delay(ms);}//停止void move_stop(int ms){ digitalWrite(11, LOW); digitalWrite(10, LOW); digitalWrite(6, LOW); digitalWrite(9, LOW); delay(ms); }//スコープ中立位置移動void scope_np(int ms){ servo0.attach(2); servo1.attach(4); servo2.attach(7); servo0.write(90); servo1.write(80); servo2.write(100); delay(ms); servo0.detach(); servo1.detach(); servo2.detach();}//スコープ駆動void scope_drive(int deg0, int deg1, int deg2, int ms)//deg0(θ)設定範囲:45~135°//deg1(α)設定範囲:20~140°//deg1(β)設定範囲:30~170°{ servo0.attach(2); servo1.attach(4); servo2.attach(7); servo0.write(deg0); servo1.write(deg1); servo2.write(deg2); delay(ms); servo0.detach(); servo1.detach(); servo2.detach();}, 反時計回りの動きの安定性が少々悪いですが、DCモータの速度制御とLEDの明るさ制御ができていることを確認できました。, msdesign-tokyoさんは、はてなブログを使っています。あなたもはてなブログをはじめてみませんか?, Powered by Hatena Blog
Arduinoには20種類以上のエディション(種類)があり、これからArduinoを使って、電子工作を始める初心者にとって、どれを選んだらいいのか迷ってしまうと思います。結論から言えば、Arduinoで最も代表的かつ基本的なエディションである「Arduino Uno」がおすすめなの…
・編集 2019/11/23 12:51, Arduinoとprocessing間のシリアル通信を利用した作品を作っています。
事前に20枚の画像自体を一つの動画として書き出し、それを読み込んでpause()とplay()で停止・再開する方法です。 どちらも流れとしては Serial.read で受け取った角度情報にサーボモータを回すという処理になります, SG90 のサーボモータは送信するパルス幅の長さが約 610ms から 2350ms で 0 度 から 180 度の動きをするようです
teratailを一緒に作りたいエンジニア, 回答ありがとうございます!!仰る通りプログラムを書き換えたら、無事思っていたように動きました!こちらはシリアル通信で受け取る値自体をnoLoop()したりloop()しているという認識で大丈夫でしょうか?, drawの中にif (sensors == 1) noLoop();とif (sensors == 2) loop();がありましたが、noLoop状態だとdraw自体が呼ばれなくなるんだと思います。, なるほど、確かにmousePressedはnoLoopした後も動いてましたし、serialEventも動くかもと予想できますね。その発想は無かったので助かりました…!ありがとうございました。.
2019年7月20日 1:17 PM.
Arduinoでロボットを作ってみました!【10】動作試験Part1:首関節が痙攣してる!! deg = 610 + input / 180.0 * ( 2350 - 610 ); loop メソッドはその名の通りずっとループしています
2つのタクトスイッチをそれぞれ停止用、再開用として使いたいです。 Processing側では画像を20枚読み込み、それを表示させています。 やりたいこととしては、Processing側の画像の読み込みを、Arduinoから送られてきたスイッチの値によって停止・再開することです。
茶色 -> Arduino GND; 赤色 -> Arduino 5v電源; オレンジ色 -> Arduino GPIO 8 番; に接続します GPIO は他の好きなところで OK ですが、今回は 8 番を使って進めていきます. なので、move_servo は 20ms の wait をおいて常にコールされているため入力を変えない限り 20ms の間隔で同じパルス幅の信号が送信されていることになります, このプログラムで実際に動作させてみると入力した角度に動くのは動くのですが、サーボモータが動いていないときに「ジリジリ」という音と微妙な振動が発生してしまいました かつては技術系のTipsややったみたを中心にポストしていました。今は趣味を中心にポストしています, Arduino でサーボモータを制御してみました
Arduinoでロボットを作ってみました!【13】動作試験Part3:測距モジュールの特性確認.
サーボモータから出ている線の.
動画等はなくて恐縮ですが、実行して比較してみると Servo ライブラリを使ったほうが断然いい感じにサーボモータが動きます, Arduino でサーボモータを制御してみました mousePressed()の中のloop()によって、マウスをクリックすれば再開は可能ですが、今回はArduinoからの値を使って再開させたいです。, teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。, 評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。, 上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。, 全く異なる方法ですが、一応自己解決にも至りました。
両方使うとボードが増えて大変ですが、、, http://tetsuakibaba.jp/index.php?page=workshop/ServoBasis/main, http://marupeke296.com/EL_Ard_No9_ServoMotor.html, markdown2impress を使って Markdown からスライドを作成してみた, Express + CoffeeScript で簡単な REST API アプリを作成してみた, 【apache】X-Forwarded-Forの設定方法と使い方(LocationごとにIP制限), RaspberryPi に BlueZ をインストールして BLE を検知してみた. なので、パルス幅を計算するロジックがなくなります, のロジックでほぼ言わなくなりました 光センサの値を読み取って1回だけ乱数を発生させてその結果に応じた文字を表示させるプログラムがうまく動... 回答