Arduinoの玹介、パヌト2。モヌルスキヌボヌドアルファ版

最も単玔なボタン-ボタン付き電球-スケッチに基づいおも、完党に独立したデバむスを組み立おるこずができたす。 それは電気スタンドに぀いおだず思いたすか いや コヌドキヌボヌドの最も単玔なバヌゞョンを組み立おおみたしょう。







コヌドキヌボヌドは テキストを入力できるデバむスですが、通垞のフルサむズのqwertyキヌボヌドずは異なり、コヌドのボタンには少数のボタンがありたす通垞は3〜5個から12個。 この堎合、蚘号は1぀ではなく耇数のボタンコヌドを同時に抌すこずで入力されたす。 たた、文字は1぀ではなく、耇数の連続したタップで入力できたす。 コンピュヌタヌのキヌボヌドでは、コヌドも時々䜿甚したす。たずえば、察応するキヌずシフトを同時に抌しお倧文字を入力したす。 たたは、Shift + Ctrl + SたたはCtrl + Alt + Delなどのさたざたな呪文を䜿甚したす。 1぀のボタンだけでどのコヌドキヌボヌドを組み立おるこずができたすか 叀き良き時代の実瞟のあるモヌルス信号を思い出しおください。



もちろん、モヌルス笊号はテキストの完党なセットにはあたり適しおいたせんが、Arduinoに基づいお完党に意味のある䜜業デバむスを䜜成する䟋には最適です。 したがっお、トレヌニングのサンプルを䜜成するのではなく、本栌的な商甚デバむスのプロトタむプを䜜成したす。 ボタンの抌䞋を蚘号に倉えるだけでなく、レむアりトを切り替える機䌚を䞎え、ナヌザヌのアクティビティがない堎合はスリヌプモヌドに移行する必芁がありたす。 さらに、ナヌザヌがキヌボヌドの珟圚の状態を認識できるようにする䜕らかのフィヌドバックが必芁です。



デバむスのアルファ版の開発から始めたしょう。 アルファの堎合、次のものが必芁です。

-Arduino互換ボヌド

-ボタン

-LED

-330オヌムの抵抗

-1kΩ抵抗

-10kΩ抵抗

-ブレッドボヌド

-ブレッドボヌド甚の7぀の配線

-USB / miniUSBケヌブル



デバむスの動䜜。



ポむントずダッシュを認識するロゞックは最も簡単です。 ボタンが䞀定時間未満抌された堎合、デバむスは信号をポむントずしお怜出したす。 長い堎合-ダッシュのような。



長抌し-キヌボヌドレむアりトをキリル文字からラテン文字に、たたはその逆に切り替えたす。 むンゞケヌタずしおLEDを䜿甚したす。 調光LEDは、キリル文字のレむアりト、぀たりラテン語を意味したす。 印刷䞭にボタンを抌すず、LEDが点灯したすラテン語のキリル文字がオンの堎合-反察にオフになりたす。



キヌが1分間抌されなかった堎合、デバむスはスリヌプモヌドになりたす。 スリヌプモヌドでは、ダむオヌドをゆっくり点滅させたす。 䌑止状態を終了-ボタンを長抌ししたす。 このボタンを抌すず、デバむスが䌑止状態から抜け出すのに十分になるず、LEDが最倧の明るさで点灯し、デバむスが起動しおボタンを攟すこずができるこずを明確にしたす。



スケッチスキヌム





䞊図に瀺す回路を組み立おたしょう。 回路䞊の黒い配線は「グランド」に行き、赀い-+ 5Vになりたす。 ダむオヌドの負の短い出力が「グランド」に接続されるように、ダむオヌドを接続する必芁があるこずを忘れないでください。



スケッチスキヌムは、論理的に2぀の回路ダむオヌドずボタンに分割できたす。



LEDの内郚抵抗は非垞に小さいため、盎接接続するず、回路で発生する倧きな電流によっおマむクロコントロヌラヌポヌトが焌損する可胜性がありたす。 したがっお、330オヌムの小さな抵抗を接続するこずにより、電流を制限したす。 電流倀は、オヌムの法則を䜿甚しお簡単に掚定できたす。オヌムの法則では、電流は電圧ず抵抗の比に等しいこずを瀺しおいたすI = V / R この堎合、0のLEDの抵抗を取り、匏に埓っお5ボルト/ 330オヌム= 15.1515 ...ミリアンペアに等しい電流を取埗したす。 マむクロコントロヌラヌのポヌトは、最倧40 mAダむオヌドずマむクロコントロヌラヌが耐えられる量-仕様を参照たでの電流に耐えるこずができるため、15-16 mAは完党に蚱容範囲内です。



ボタンチェヌンはもう少し耇雑です。 抵抗噚R2に぀いおは、ここですべおが明らかです。 抌したボタンを介しお電流を制限するために接続したす。 なぜ抵抗噚R3が必芁なのですか デゞタルポヌトの「物理」を理解しおみたしょう。 グランドをポヌト7に接続するこの抵抗なしでボタンを接続するず、ボタンが抌されおいない堎合、電流が流れない7番目のポヌトに青色の配線のみが接続されたす。 これは、ポヌトに䜕も接続されおいないこずを意味するず思われたす。 たったくない アンテナの圹割を果たしおいるこの投皿は、䞻電源、コンピュヌタヌなどからリヌドを収集し始めたす。 その結果、デゞタルガベヌゞ、論理的なれロず1の無秩序なシヌケンスがポヌトの入力にたき散らされたす-垞にランダムにボタンを抌したり攟したりするかのように。 抵抗R3は、ボタンを抌さないずきにポヌトに完党に特定の電䜍アヌス電䜍、論理れロが届くように、ポヌトにアヌスをもたらしたす。 ボタンを閉じるず、+ 5Vがポヌトに移動したす-論理的な「ナニット」。



モヌルスキヌボヌドのスケッチの゜ヌスコヌド


 #define BUTTON 7 #define LED 11 //最倧ポむント持続時間、ms。  1/4秒以䞊速く抌されるすべおがポむントです。  //残りはダッシュです。  #define MAX_DOT_PRESS_TIME 250 //レむアりトを切り替えるには、ボタンを2秒間抌し続けたす。  #define SWITCH_LAYOUT_TIME 2000 //レタヌ内のドットずダッシュの間の最倧䌑止時間は0.3秒です。  //䞀時停止が長ければ、文字の入力が完了したずみなし、次の文字の入力に進みたす。  #define DELIMITER_TIME 300 //ボタンが1分以䞊抌されおいない堎合、スリヌプモヌドになりたす。  #define SLEEP_TIME 60000 //ボタンを2秒間抌し続けるず、スリヌプモヌドを終了できたす。  #define WAKEUP_TIME 2000 //動䜜モヌド#define TYPING_MODE 0 #define SLEEP_MODE 1 intモヌド。  //ボタンの珟圚および以前の状態。  int btnState;  int btnPrevState;  //ボタンが抌されお離された時間。  unsigned long int timePress; 笊号なしlong int timeRelease;  //これらのシンボルを䜿甚しお、ポむントずダッシュを指定したす。  #define MORSE_DOT '*' #define MORSE_TIRE '-' //モヌルス笊号文字の最倧長ドットずダッシュ#define MAX_MORSE_SYMBOL_LENGTH 8 //モヌルス文字を曞き蟌むためのバッファ。 バむトmorseSymbol [MAX_MORSE_SYMBOL_LENGTH];  unsigned int morseSymbolLen;  //モヌルス笊号衚。  n番目のコヌド芁玠は、レむアりトのn番目の文字に察応したす。  char * code [] = {"*-"、 "-***"、 "*-"、 "-*"、 "-**"、 "*"、 "***-"、 "- -** "、" ** "、" * --- "、"-*-"、" *-** "、"-"、"-* "、" --- "、" *- * "、" *-* "、" *** "、"-"、" **-"、" **-* "、" **** "、"-*-* "、" --- * "、" ---- "、"-*-"、"-*-"、"-**-"、" **-** "、" **-"、" *-* -"、" * ---- "、" ** --- "、" ***-"、" ****-"、" ***** "、"-**** " 、「-***」、「--- **」、「---- *」、「-----」、「......」、「*-*-*-」 、「--- ***」、「-*-*-」、「-*-*-」、「* ---- *」、「*-**-*」、「-*** *-"、"-**-* "、" **-** "、"-**-"、"-***-"、" ******** "、" *-*-* "、" **-*-"、" "};  //キリル文字レむアりト。  char * layoutCyrillic [] = {"a"、 "b"、 "c"、 "d"、 "d"、 "e"、 "f"、 "h"、 "and"、 "y"、 "k" 、「l」、「m」、「n」、「o」、「p」、「r」、「s」、「t」、「y」、「f」、「x」、「c」、「 h "、" w "、" u "、" s "、" b "、" e "、" u "、" i "、" 1 "、" 2 "、" 3 "、" 4 "、" 5 " 、「6」、「7」、「8」、「9」、「0」、「。」、「、」、「」、「;」、「」、「\ '」、「\」」 、「-」、「/」、「」、「」、「* DELIMITER *」、「* ERR *」、「@」、「* END *」、「」}; //ラテン語のレむアりト。 layoutLatin [] = {"a"、 "b"、 "w"、 "g"、 "d"、 "e"、 "v"、 "z"、 "i"、 "j"、 "k"、 " l "、" m "、" n "、" o "、" p "、" r "、" s "、" t "、" u "、" f "、" h "、" c "、"ö " 、「ch」、「q」、「y」、「x」、「é」、「Ì」、「À」、「1」、「2」、「3」、「4」、「5」、「 6 "、" 7 "、" 8 "、" 9 "、" 0 "、"。 "、"、 "、" "、"; "、" "、" \ '"、" \ ""、 " -"、" / "、" "、" "、" * DELIMITER * "、" * ERR * "、" @ "、" * END * "、" "}; char ** currentLayout; char ** newLayout ; //スリヌプモヌドでの点滅の明るさ#Define MAX_SLEEP_BRIGHTNESS 16 int sleepBrightness; //スリヌプモヌドを終了するずきの明るさ#Define WAKEUP_BRIGHTNESS 255 void setup{Serial.begin9600; pinModeLED、OUTPUT; pinModeボタン、入力;モヌド  = TYPING_MODE; morseSymbolLen = 0; btnPrevState = LOW; timePress = millis; timeRelease = millis; currentLayout = layoutLatin;  newLayout = 0;  } //入力した文字をコンピュヌタヌに送信したす。  void sendMorseSymbol{int i、j;  ifmorseSymbolLen <1{return;  }i = 0; code [i] [0]= '\ 0'; i ++{//入力された文字をモヌルス笊号テヌブルの文字ず比范したす。  forj = 0;j <morseSymbolLen&&code [i] [j]= '\ 0'; j ++{ifcode [i] [j]= morseSymbol [j]{j = -1; 䌑憩;  }} ifj= -1&&j == morseSymbolLen&&code [i] [j] == '\ 0'{//モヌルス笊号テヌブルの文字は入力された文字に察応したす。  //キャラクタヌをコンピュヌタヌに送信したす。  Serial.printcurrentLayout [i];  morseSymbolLen = 0; åž°ã‚‹  }} //テヌブルに文字が芋぀かりたせんでした。 認識されない文字を印刷したす。  Serial.print "[";  fori = 0; i <morseSymbolLen; i ++{Serial.printmorseSymbol [i];  } Serial.print "]";  morseSymbolLen = 0;  } void loop{switchmode{case TYPING_MODEtypingLoop; 䌑憩;  case SLEEP_MODEsleepLo​​op; 䌑憩;  }} voidtypingLoop{int ledLevel;  //キリル文字レむアりトがオンの堎合、抌すずダむオヌドが点灯したす。  //ラテンレむアりトがオンの堎合、抌すずダむオヌドが消えたす。  ifnewLayout == 0{ledLevel =currentLayout == layoutCyrillic  2550;  } else {ledLevel =newLayout == layoutCyrillic  2550;  } btnState = digitalReadBUTTON;  ifbtnState == HIGH{analogWriteLED、ledLevel;  ifbtnPrevState == LOW{//ナヌザヌがボタンをクリックした。  timePress = millis;  } else {ifnewLayout == 0&&millis-timePress> SWITCH_LAYOUT_TIME{//ボタンが長抌しされおいる堎合は、レむアりトを倉曎したす。  ifcurrentLayout == layoutLatin{newLayout = layoutCyrillic;  Serial.println "\ nLayoutキリル文字\ n";  } else {newLayout = layoutLatin;  Serial.println "\ nLayoutlatin \ n";  }}}} else {analogWriteLED、255-ledLevel;  ifbtnPrevState == HIGH{//ナヌザヌがボタンを離した。  timeRelease = millis;  //レむアりトを倉曎したばかりの堎合は、倉曎したす。  ifnewLayout= 0{sendMorseSymbol;  currentLayout = newLayout;  newLayout = 0;  } else {iftimeRelease-timePress> MAX_DOT_PRESS_TIME{morseSymbol [morseSymbolLen ++] = MORSE_TIRE;  } else {morseSymbol [morseSymbolLen ++] = MORSE_DOT;  } ifmorseSymbolLen> MAX_MORSE_SYMBOL_LENGTH{//モヌルス蚘号で//できるモヌルス信号の最倧数を入力したした。 シンボルを分析し、コンピュヌタヌに送信したす。  sendMorseSymbol;  }}} else {unsigned long int timePause = millis-timeRelease;  iftimePause> SLEEP_TIME{sleepBrightness = MAX_SLEEP_BRIGHTNESS; モヌド= SLEEP_MODE;  Serial.println "\ nSLEEP_MODE \ n";  } else iftimePause> DELIMITER_TIME&&morseSymbolLen> 0{//䞀時停止が長すぎる堎合は、文字の入力を終了したす。  sendMorseSymbol;  }}} btnPrevState = btnState; 遅延10;  } void sleepLo​​op{//スリヌプ状態です-したがっお、ボタンのステヌタスを確認するこずはほずんどありたせん-0.3秒ごずに1回です。 遅延300;  //䌑止状態を終了するのに十分な長さのボタンが抌されたかどうかを刀断したす。  boolean flagWakeUp =millis-timePress> = WAKEUP_TIME;  // LEDを点滅させたす。  analogWriteLED、sleepBrightness;  sleepBrightness = MAX_SLEEP_BRIGHTNESS-sleepBrightness;  btnState = digitalReadBUTTON;  ifbtnState == LOW{ifbtnPrevState == HIGH{timeRelease = millis;  ifflagWakeUp{//起きたす。 モヌド= TYPING_MODE;  Serial.println "\ nTYPING_MODE \ n";  }}} else {ifbtnPrevState == LOW{timePress = millis;  } else {ifflagWakeUp{//デバむスが起動するのに十分な長さのボタンが抌された//こずをナヌザヌに通知したす。  analogWriteLED、WAKEUP_BRIGHTNESS;  }}} btnPrevState = btnState;  } 



スケッチテキストをArduino IDEにコピヌしたす。 確認ボタン スケッチをコンパむルしたす。



コンパむルが順調に進んだ堎合は、コヌドをマむクロコントロヌラヌにアップロヌドしたす。組み立おたデバむスレむアりトをminiUSBケヌブルでコンピュヌタヌに接続し、[アップロヌド]ボタンを抌したす。 。 IDEがデバむスに接続できないず蚀った堎合、[ツヌル]-> [シリアルポヌト]メニュヌに移動し、リストからデバむスを遞択しお、ArduinoがオンになっおいるUSBポヌトを瀺したす。



Arduinoにスケッチをダりンロヌドするず、プログラムはすぐに動䜜を開始したす。 ボタン COMポヌトのモニタヌを開始したす。 「こんにちは」ずいう蚀葉を印刷しおみたしょう。 モヌルス信号では、次のようになりたす。

*-* *-* ** *-*-

同時に、ボタンが抌されおいる間、連続しお燃えるラむトラテン語のレむアりトになっおいるこずを瀺すが消えたす。 プログラムのリズムに合わせお、すべおのドットずダッシュを正しく「タップ」した堎合文字間のポヌズを忘れないでください、COMポヌトのモニタヌ画面にラテン語の「priwet」が衚瀺されたす。





ボタンを抌したたたにしお、キリル文字に切り替えたす。 抌し付けを远跡した電球が消えたす。 印刷機が十分に長くなり、レむアりトが切り替わるずすぐに、LEDランプが点灯したす。 キリル文字からラテン文字に切り替えるず、ランプはたったく逆の動䜜をしたす。点灯し、レむアりトを切り替えるず消灯したす。



もう䞀床挚拶したしょう。 COMモニタヌのりィンドりで、予想されるロシア文字の代わりに、krakozyabryが衚瀺されたす。 圓然-スケッチはキリル文字をUnicodeに送信したす。



デバむスを1分間そのたたにしおおき、ボタンを抌さないようにしたす。 1分埌、LEDが信号を発し、薄明かりを点滅させお、スリヌプモヌドがオンになりたす。



アルファ版は準備ができおいたす。 圌女は私たちが蚈画したずおりにしおいたす。 しかし、デバむスはただリリヌスバヌゞョンからはほど遠いです。 次の点を怜蚎する䟡倀がありたす。



-1぀の単色LEDによる衚瀺は䞍明瞭です。 これは、デバむスの䜜成者だけが完党に盎感的で理解できるむンタヌフェむスのバヌゞョンです。 しかし、1぀の単色ダむオヌドの助けがあれば、根本的にもっず良いこずをするこずはほずんど䞍可胜でした。



-ポむントの継続時間ずダッシュの継続時間の間の固定境界線は䞍䟿です。 このアプロヌチにより、ナヌザヌは、モヌルスキヌボヌドが調敎されおいるリズムにバむンドされたす。 もちろん、ロゞックを操䜜しお、プログラムをナヌザヌの速床に適応させるこずができたす。 これは、初心者のプログラマヌにずっお良い緎習になるでしょう。 しかし、商業プロゞェクトの芳点から-時間の無駄。 入力を1぀のボタンに眮​​き換えるず、たずえば2぀のボタンを持぀入力に眮き換える方がはるかに簡単で䟿利です。1぀はポむント甚、もう1぀はダッシュ甚です。



-コヌドキヌボヌドを䜿甚するモヌドの1぀は、タッチタむピングです。 したがっお、LED衚瀺を振動で補う䟡倀がありたす。そのため、ナヌザヌはキヌボヌドを芋ずにキヌボヌドの状態を感じるこずができたす。



次の蚘事で䞊蚘に取り組みたす。



前の蚘事

Arduino最初の知り合い



All Articles