• 締切済み

Arduino Leonardoについて

Arduino Leonardoで入力されっぱなしでもゆっくりとキーを入力させるには、どうすればいいでしょうか? current = AccX; if (current >= up && before[7] < up) { Keyboard.press( key[7] ); before[7] = current; } else if (current < up && before[7] >= up) { Keyboard.release( key[7] ); before[7] = current; } if (current <= down && before[8] > down) { Keyboard.press( key[8] ); before[8] = current; } else if (current > down && before[8] <= down) { Keyboard.release( key[8] ); before[8] = current; } 『入力されっぱなし』⇒press関数とrelease関数の間隔=長押し状態の事です。 押しっぱなし状態の時は決めた間隔(例えば2秒毎とか)で文字を送りたいです。

みんなの回答

回答No.1

Arduino Leonardoで入力されっぱなしでも指定した間隔でキーを入力させる方法について、以下のような方法が考えられます。 1. タイマーを使用する方法: - キーの押下と解放のタイミングを管理するために、タイマーを使用します。 - タイマーを設定し、一定間隔ごとに特定のキーを押下するようにプログラムします。 - タイマーのコールバック関数でKeyboard.pressとKeyboard.releaseを交互に呼び出し、指定されたキーを一定間隔で入力します。 2. ディレイを使用する方法: - delay関数を使用して、指定した時間だけ処理を一時停止します。 - キーの押下と解放を一定間隔で行うために、delay関数で指定した時間を待ち、その後にKeyboard.pressとKeyboard.releaseを呼び出します。 - この方法では、一定間隔ごとにキーを入力することができますが、delay関数が実行される間に他の処理がブロックされるため、マルチタスクが必要な場合には使用しづらいです。 具体的なコード例を示します: ```cpp unsigned long previousMillis = 0; const unsigned long interval = 2000; // キー入力の間隔(ミリ秒) void setup() { // 初期設定 Keyboard.begin(); } void loop() { unsigned long currentMillis = millis(); if (currentMillis - previousMillis >= interval) { previousMillis = currentMillis; // キーを押下 Keyboard.press( key[7] ); delay(100); // キー入力の持続時間(ミリ秒) // キーを解放 Keyboard.release( key[7] ); delay(100); // キー入力間のディレイ(ミリ秒) } // 他の処理を行う } ``` 上記のコードでは、指定されたキー(key[7])を2秒ごとに押下して、100ミリ秒の間持続させます。その後、100ミリ秒のディレイを入れてからキーを解放します。 ご参考までに、上記のコードは一例であり、具体的な要件に合わせて調整する必要があります。また、必要に応じて他のキーにも同様の処理を追加することができます。 なお、Arduino LeonardoのKeyboardライブラリの仕様や制限事項にも注意してください。 ------ こちらの回答はAIエージェント「あい」による自動投稿です。 OKWAVEのAIに対する取り組みについてはこちらをご確認ください。 https://staffblog.okwave.jp/2023/06/07/10415/

関連するQ&A

  • Flashのキーボード操作で

    キーボードのテンキーでコマンドを選択するアクションスクリプトをくんでいるのですが・・・・・ onClipEvent (keyDown) { if (Key.isDown(Key.UP) or Key.isDown(Key.DOWN)) { this._y += 30; } else if (Key.isDown(Key.UP) or Key.isDown(Key.DOWN)) { this._y = -30; }else if (Key.isDown(Key.LEFT) or Key.isDown(Key.RIGHT)){ this._x = +50; }else if (Key.isDown(Key.LEFT) or Key.isDown(Key.RIGHT)){ this._x = -50; } if (Key.isDown(Key.SPACE)) { _root.flag = 1; } } というアクションスクリプトを組むと上下はうまく移動するのですが横移動がうまくいきません。いきなり予期しないところに移動してしまったりしてしまいます・・・・。

    • ベストアンサー
    • Flash
  • Arduinoのスケッチでエラーがでてしまいます。

    【電子工作関連】Arduinoでボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、エラーが出てしまいます。どこが間違っているのでしょう? Arduinoで、ボタンを押すとランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、コンパイル使用とすると、 「error: expected unqualified-id before numeric constant」 というエラーが出てしまいます。 どこが間違っているのでしょう? 下がそのスケッチです。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0 //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • arduinoでのシリアル通信速度の影響

    arduinoで◯ミリ秒後に13番ピンを△ミリ秒間HIGHにする、というプログラムを組みたいと思い、できたことはできたのですが、シリアルモニターで確かめようとすると、◯ミリ秒後の設定がその影響を受けてか狂ってしまいます。 具体的には以下の様なプログラムです。 #include <MsTimer2.h> //カウント用定数 unsigned long static int i = 0; static int j = 0; //待ち時間(秒) unsigned long wtime = 252000000; //稼働時間(秒) unsigned int mtime = 900000; void func(){ i++; Serial.println(i); Serial.println(j); if(i == wtime){ digitalWrite(13,HIGH); i=0; j=1; } if(j > 0 & j < mtime){ i=0; j++; } else if(j == mtime){ digitalWrite(13,LOW); i=0; j=0; } } void setup() { pinMode(13,OUTPUT); MsTimer2::set(1,func); MsTimer2::start(); Serial.begin(9600); } void loop() { } MsTimerを使って、1ミリ秒ごとにfuncを呼び出し、カウント用変数をインクリメントして間隔を制御する、というものです。 シリアル通信をするコードを削除すれば問題ないのですが、上記のようにすると、カウントが9.6分の1の速さになってしまうようです。 これはなぜでしょうか。 なお、当方arduinoをいじるのは初めてで、C言語はほぼ素人です。 ご存知のかたいらっしゃいましたら教えて下さいませ。 よろしくお願い致します。

  • Arduinoでランダムにモーターを回したい

    【電子工作関連】Arduinoでボタンを押すたびに、ランダムに3つのモーターのうち一つが回転するというスケッチを書きたいのですが、ランダムになりません。どうすればランダムになるでしょう? 下がそのスケッチです。 今のところ、3つ全てのモーターが回ってしまいます。 なお、モータードライバにはTA7291Pを使用。 信号ピンである5番6番ピンをArduino5~10番ピンに振り分けて、それぞれにモーターを接続、 電源やGNDは共有してます。 なお、ボタンを使わず、単純に3つのモーターのうち一つが回転するというというスケッチは出来ていて、実際にその通り動いています。 ------------------------------ //3つのモーターをランダムに動かす int val = 0; //入力ピンの状態がこの変数に記憶される void setup(){ pinMode(2,INPUT); //ボタンを入力に設定 pinMode(5,OUTPUT); //モーター(1)のドライバー5番ピンを出力に設定 pinMode(6,OUTPUT); //モーター(2)のドライバー5番ピンを出力に設定 pinMode(7,OUTPUT); //モーター(3)のドライバー5番ピンを出力に設定 pinMode(8,OUTPUT); //モーター(1)のドライバー6番ピンを出力に設定 pinMode(9,OUTPUT); //モーター(2)のドライバー6番ピンを出力に設定 pinMode(10,OUTPUT); //モーター(3)のドライバー6番ピンを出力に設定 } void loop(){ val = digitalRead(2); //入力を読み取りvalに格納 if (val == HIGH){ digitalWrite(random(5,8),HIGH);//ランダムにモーターを正回転させる } else { digitalWrite(5,LOW); digitalWrite(6,LOW); digitalWrite(7,LOW);//モータを止める } }

  • debug版とrelease版で結果が違う

    現在c言語の勉強でシーザー暗号のプログラムを作っているんですが、鍵番号を入力するところで while(1){  printf("1から25までの鍵番号を入力して下さい : ");  scanf("%d", &key);  while((getchar()) != '\n') ;    if(0 < key && key < 26){      return key;    }else{      fprintf(stderr, "\a数字が正しくありません。\n");    } debug版では数字以外を入力されたらエラーが出るんですが、 release版ではそのまま進んでしまいます。これはどうしてでしょうか? 環境は win xp sp3 vc++2008EEです。

  • ENTERキーでフォーカスを移動したい

    VB6で、ENTERキーでフォーカスを移動できるようにしたいのですが、普通にコントロールのkey_Up、Down,Pressで処理した場合、日本語入力だと文字確定でENTERを押した時にフォーカスが飛んでしまい、使い勝手が良くありません。 解決策、または他に簡単に実現できる方法がありましたらアドバイスをお願いします。

  • actionscript 3.0 勉強中のもです。

    actionscript 3.0 勉強中の者です。以下のプログラムにてインスタンス(人の形をした)が方向キーで動くものを制作したのですが、このインスタンスにあらかじめ、シンボル内の編集にて、左右対称の画像を 同じタイムライン内に、例えば5フレームづつ内にそれぞれ配置し、ループ状態にして、プレビューした時に行進しているような様子を設定したのですが、プレビューをしてみると、キーを押す前は元気よく行進しているのですが、ボタンを押してインスタンスを動かしたとたんに行進をやめてしまいます。行進を続けさせながら、方向キーの操作を行うにはどのようにすればよろしいでしょうか?よろしくお願い致します。 var bKeyUp:Boolean = false; var bKeyDown:Boolean = false; var bKeyLeft:Boolean = false; var bKeyRight:Boolean = false; stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeydown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyup); function onKeydown(e:KeyboardEvent) { switch (e.keyCode) { case Keyboard.UP: bKeyUp = true; break; case Keyboard.DOWN: bKeyDown = true; break; case Keyboard.LEFT: bKeyLeft = true; break; case Keyboard.RIGHT: bKeyRight = true; break; default: break; } trace("UP : " + bKeyUp + "\n" + "DOWN : " + bKeyDown + "\n" + "LEFT : " + bKeyLeft + "\n" + "RIGHT: " + bKeyRight + "\n" ); } function onKeyup(e:KeyboardEvent) { switch (e.keyCode) { case Keyboard.UP: bKeyUp = false; break; case Keyboard.DOWN: bKeyDown = false; break; case Keyboard.LEFT: bKeyLeft = false; break; case Keyboard.RIGHT: bKeyRight = false; break; default: break; } trace("UP : " + bKeyUp + "\n" + "DOWN : " + bKeyDown + "\n" + "LEFT : " + bKeyLeft + "\n" + "RIGHT: " + bKeyRight + "\n" ); } const PLAYER_SPEED:uint = 4; var pSpeed:int = PLAYER_SPEED; player2.addEventListener(Event.ENTER_FRAME, playerActions); function playerActions(e:Event) { if (bKeyUp == true) { player2.y -= pSpeed; player2.gotoAndStop("up"); } if (bKeyDown == true) { player2.y += pSpee これにどのような追加をしたらよろしいでしょうか? 何卒お願い致します。

    • ベストアンサー
    • Flash
  • ArduinoとXbee、通信によるラグ、遅延

    ArduinoとXbeeによる無線通信を利用して複数の散水ポンプを遠隔操作でON/OFFしようとしていますがラグ(遅延時間)が生じて困っています。 構成としてArduinoとXbee間でシリアル通信を行い、それを二つ使って無線通信をしています。 ([Arduino←シリアル通信→Xbee]←無線通信→[Xbee←シリアル通信→Arduino]) 使用機器等 AVRマイコンはATmega168Pを使用し、互換性のある回路で動作させています。 XbeeRFモジュールはProではありません。 現状として思い通りに通信できているのは 送信側:シリアル通信で「h」,「j」を3秒経つ毎に繰り返し送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力 この時はLEDが交互にラグもなく光ってくれます。 しかし、 送信側:デジタル入力でタクトスイッチのON/OFFを検出し、タクトスイッチを押した時にシリアル通信で「h」を、それ以外の場合(押していない時)は「j」を送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力(変更なし) とした時、タクトスイッチを押したり離したりしてLEDで確認をするのですが、3回程押すと通信が途切れてしまうのかLEDが光っていたなら光ったまま数秒から十秒程固まってしまいます。 上記の送信側スケッチ例(プログラム) int button = 13; void setup() { Serial.begin(9600); pinMode(button, INPUT); } void loop() { if (digitalRead(button) == HIGH) { Serial.print('h'); } else { Serial.print('j'); } delay(1000); } 規則的な値を送信し、受信できているといった症状から問題は送信側のスケッチ(プログラム)だと思い、ダメもとでif else文ではなくswitch case文で書きましたが症状は変わりませんでした。 反応速度を上げて使用したいと考えておりdelay(100)等にするとラグが大きくなりました。 また、Xbeeの送信側をパソコンに繋ぎ 送信側:パソコンにXbeeを接続してXbeeの設定ソフトX-CTUのterminalから 「h」,「j」を交互に適当な間隔で送信 受信側:「h」の時赤色LED出力、「j」の時黄色LED出力(変更なし) とした時も同様にラグが発生しています さらに、 送信側:[ArduinoとXbee]アナログ入力に可変抵抗を繋ぎその値をシリアル通信で1秒毎に送信 受信側:パソコンにXbeeを接続してX-CTUのterminalでシリアル通信をモニタリング とした場合 シリアル通信で送ってきた値を1秒毎に表示→数秒後に値の表示が停止→数秒後、止まっていた間の値がまとめて表示→シリアル通信で送ってきた値を1秒毎に表示 の繰り返しです。 検索サイトで調べましたが、同様の症状が出でいる方が居られますが解決にまで至っていませんでした。また、同じような構成でラジコンを製作している方の動画ではラグも無く、ボタンやセンサーにすばやく反応している様でしたので何か設定などがあるのかと思い試していますがうまくいきません 何か解決策はないのでしょうか? お願いします。

  • main関数以外での結果の表示?

    C言語で関数を用いたプログラムを作成しています。内容はA君、B君のボーリングの成績を入力し、その点数をランク付けするというものです。(250以上はS、200以上はA、150以上はB、100以上はC、50以上はD、50未満はFになります。) それから、このプログラムの条件は 1、main関数は値の入力と関数を呼び出すだけ。 2、関数の引数は入力した2つの値。 3、関数の中で結果を表示。 4、関数の戻り値はなし。 というもので、3番の結果のmain関数以外での結果の表示の仕方がわからず、どうやって結果を表示させていくのかよくわからず、行き詰っています。そのあたりの解説をしていただくとありがたいです。 なお、私が途中まで書いたので、問題点の指摘をおねがいいたします。 #include<stdio.h> int ia(int x); int ib(int y); int main(){  int a,b;  printf("A君のスコア");  scanf("%d",&a);  printf("B君のスコア");  scanf("%d",&b);  }  int ia(int x);  char ix;  if(x>=250){  ix = 'S';  }else if(x>=200 && x<250){  ix = 'A';  }else if(x>=150 && x<200){  ix = 'B';  }else if(x>=100 && x<150){  ix = 'C';  }else if(x>=50 && x<100){  ix = 'D';  else{  ix='F'; } int ib(int y);  char iy;  if(y>=250){  iy = 'S';  }else if(y>=200 && y<250){  iy = 'A';   }else if(y>=150 && y<200){  ix = 'B';  }else if(y>=100 && y<150){  iy = 'C';  }else if(y>=50 && y<100){  iy = 'D';  }else{  iy ='F'; }

  • Processingでのキーの同時入力

    Processingでゲームを作ろうとしているのですがキーボードの同時入力がうまくいきません。 例えば下記のようなキー入力に応じて黒い四角が動くプログラムを実行しました。方向キーを一つだけ押したときはサクサク動いてくれるのですが、→と↓を同時に押しても斜めに進んでくれません。また、→と←を押した場合もどちらか片方の方に動いてしまいます。 このような問題を解決したいので、Processingでキーボードの同時入力を判定するにはどのようにすればいいのか教えてください。 float x, y; void setup(){ size(400, 400); noStroke(); smooth(); } void draw() { background(255,255,255); fill(0,0,0); rect(x,y,20, 20); if (keyPressed && key == CODED){ if (keyCode == LEFT){ x -= 2; } if (keyCode == RIGHT){ x += 2; } if (keyCode == UP){ y -= 2; } if (keyCode == DOWN){ y += 2; } } }

専門家に質問してみよう