Arduinoの紹介、パート3。モールスキーボード:ベータ版

2月上旬、私はArduinoの「ラジオデザイナー」に基づいてモールスキーボードを組み立てようとしました 。 それは、ボタンをクリックするだけで完全に機能するプロトタイプであることが判明しました。クリックすると、ドットとダッシュを「生成」できます。そこからマイクロコントローラーが文字を収集し、コンピューターに送信します。 デバイス(ブレッドボード上の6つ以上の詳細を使用してデバイスを呼び出すことができる場合)は、非常に機能することが判明しました。 しかし、実際の使用には不適切なので、設計を改善するつもりでした。 そして、これが私がしたことです。







まず、モールスキーボードの新しいバージョンでは、1つのボタンでポイントとダッシュを入力することを拒否する価値があります。 ワンタッチ入力では、ユーザーのドットとダッシュがキーボードのドットとダッシュに「落ちる」ように、プログラムで規定されている時間間隔に印刷速度を調整する必要があります。 はい、ダッシュポイントを入力すると、押す時間を考慮することなく、はるかに便利です。 このオプションに、無線オペレーターと電信技師はかなり前に来て、同様のキーに切り替えました:







そこで、2つのボタンを使用します。1つはポイント用、2つ目はダッシュ用です。 同時に、情報量の少ない単色LEDをRGBダイオードに置き換えます。 色は、現在のレイアウトについてユーザーに通知できます。 さらに、デバイスをフィードバック触覚通信で補完する価値があります-たとえば、vibromotorを介して。 ただし、動作中に判明したため、vibromotorは特別なチップ( モーター制御ドライバー)を介して接続する必要があります。 そのため、vibromotorをピエゾスピーカーに置き換えましたが、これは追加の詳細なしでArduinoに直接接続できます。



仕事に必要なもの:







1) Freeduino 2009 -Arduino Duemilanoveの完全なアナログ(ただし、マイクロコントローラのはるかに弱いバリエーションで対応できます)

2) 開発ボード

3) 2つのボタン

4) アノードが共通のRGB LED

5)2つの抵抗10 kOhm

6)3つの抵抗器330オーム

7) ピエゾスピーカー (写真ではリンクはピエゾブザーです)

8) ブレッドボード上の部品を接続するための 1 ダースの配線



アルファ版を作成するには、追加で次が必要でした:

9)0.5メートルのツイストペアケーブル。 結局のところ、「ツイストペア」からの配線は、ブレッドボードの接続線として非常に適しています。

10)コンパクトディスク上の碑文用の古い非筆記フェルトペン。

11)はんだごて、はんだ、電気テープ。



RGB LEDの接続方法。



Morseキーボードの以前のバージョンでは、1つのアノードと1つのカソードを備えたシンプルな単色LEDを使用しました。 接続するのは難しくありませんでした。アノードをマイクロコントローラの出力に接続し、カソードを抵抗を介してグランドに接続します。 おそらく、共通のカソードと3つのアノードを持つRGBダイオードがあれば、同じことをするでしょう。 しかし、 Seeeduino Catalyst Packには共通アノードを備えたRGBダイオードが含まれていたため、接続について少し考える必要がありました( 正しいアドバイスをくれたArduinoの教祖に感謝!)。 ソリューションの本質は、逆論理の使用であることが判明しました(おそらくこの用語は完全に正しいわけではありません-修正に感謝します)。 以前のバージョンでは、LEDはマイクロコントローラー(MK)の出力に電圧が印加されるとオンになり、電圧がなくなるとオフになりました。 新しいバージョンでは、すべてが逆になります。 出力に電圧がない場合、ダイオードが点灯し、存在する場合は消灯します。 この独創的な回路を実装するには、ダイオードのカソードを抵抗を介してプロセッサの端子に接続します。 そして、アノード-+ 5Vに接続します。 これで、MK出力に+ 5Vがある場合、ダイオードを流れる電流はなくなり、電圧がない場合、電流が流れてLEDが点灯します。 当然、プログラムを作成するときは、反転ロジックについて覚えておく必要があります。



ボタンを接続するときは、反転ロジック適用することをお勧めしました -短絡の可能性があるため、電圧よりもアースにワイヤを引っ張る方が安全だからです。 正直なところ、論理は私には完全に明確ではありません-結局、電子は正からではなく、負の出力から「流れ」ます。 後でこれに対処することにしたので、ボタンを以前のバージョンとは少し異なって接続しました。 これで、ボタンが放されると、MKはそれに接続された出力からHIGHを読み取り、ボタンが押されるとLOWを読み取ります。



なぜピエゾツィーターが必要なのですか。 ドットとダッシュを入力するとき、画面を見ずに、入力した文字がコンピューターに送受信されたことの確認を受け取りたいです。 それ以外の場合、クイックタイピング中に文字間を十分に一時停止した後、たとえば、文字AE(*-*)の代わりに文字P(*-*)をコンピューターに送信できます。 ユーザーが各文字を送信するときに信号を受信すると、ミスが少なくなります。 もちろん、「ツイーター」の代わりに振動モーターを使用する価値がありますが、ツイーターを接続する方が簡単です。 そして、私はモールスの叙事詩の次の部分でバイブを扱います。 そのため、現時点では、キーボードから送信される各文字には、振動の代わりに短い音が鳴ります。



回路を組み立てましょう:











Fritzingプログラムで図を描きましたが、RGB LEDがどこにも見つかりませんでした。 したがって、私自身は赤、緑、青のLEDを接着してこの「詳細」を組み立てました。 ダイオードを接続するとき、どの脚がどこにあるかを理解するために、その仕様を調べる価値があります。 共通のアノードをバッテリーのプラスに接続し、各カソードをマイナスに交互に接続して、ダイオードをテストすると便利です。 LEDをテストするために、カメラから2つの直列接続された1.5ボルト(合計3ボルト)の単三電池を使用しました。



コードをコンパイルしてロードします(詳細はコメントアウトされているため、リストを簡単に示します)。


 // ================================================= ================================================== =============== //ボタンの設定。  // ================================================= ================================================== =============== //ボタンポイントは左側にあります。  #define BUTTON_DOT 6 //ダッシュボタンは右側にあります。  #define BUTTON_TIRE 7 intボタン、buttonsPrev;  //ここでは、キーの現在および以前の状態をビットマスクの形式で保存します。  #define BUTTON_DOT_MASK 1 #define BUTTON_TIRE_MASK 2 //これらの変数を使用して、ボタンが最後に押されて離された時点を特定します。 どれでも。 この//時間に基づいて、現在の文字の入力が完了したかどうか、およびスリープモードに入る時間かどうかを判断します。  unsigned long int timeRelease、timePress;  //ボタンの状態を0.03秒未満変更すると、バウンスと見なされ無視されます。  #define DEBOUNCING_TIME 30 //連絡先のバウンスをフィルタリングするために、これらの変数で時間を節約します。 符号なしlong int timeDotDebouncing; 符号なしlong int timeTireDebouncing;  //レター内のドットとダッシュの間の最大休止時間は0.4秒です。  //一時停止が長ければ、文字の入力が完了したとみなし、次の文字の入力に進みます。  #define DELIMITER_TIME 500 //ボタンが1分以上押されていない場合、スリープモードになります。  #define SLEEP_TIME 60000 //ボタンを1秒間押し続けると、スリープモードを終了できます。  #define WAKEUP_TIME 2000 //レイアウトをキリル文字に切り替えるには、ドットボタンを押してから、離さずにダッシュボタンを押します。  //レイアウトをラテン語に切り替えるには、右のダッシュボタンを押し、リリースしないでドットボタンを押します。  // ================================================= ================================================== =============== // RGB LEDの設定。  // ================================================= ================================================== =============== //フィードバックには、RGB LEDを使用します。#define LED_R 11 #define LED_G 10 #define LED_B 9 //ダイオードの色を番号ビットマスクとして設定します。 00000RGB、古き良きEGAとYamaha MSXの色を思い出してください。  // 7色(黒は数えません)で十分です。  #define COLOR_BLACK 0 #define COLOR_BLUE 1 #define COLOR_GREEN 2 #define COLOR_CYAN 3 #define COLOR_RED 4 #define COLOR_MAGENTA 5 #define COLOR_YELLOW 6 #define COLOR_WHITE 7 //緑、ラテン点滅。  #define COLOR_CYRILLIC_LAYOUT COLOR_GREEN #define COLOR_LATIN_LAYOUT COLOR_YELLOW #define COLOR_SLEEP_MODE COLOR_MAGENTA //印刷モードとスリープモードの輝度を点滅。  //ロジックが反転されていることを忘れないでください。0は最大輝度を意味し、255はオフLEDを意味します。  #define BRIGHTNESS_TYPING_LOW(255-1)#define BRIGHTNESS_TYPING_DOT(255-7)#define BRIGHTNESS_TYPING_TIRE(255-15)#define BRIGHTNESS_SLEEP_LOW(255-0)#define BRIGHTNESS_SLEEP_HIGH(255-1)/ * _T_N_ESS(* _T_GH) #define BRIGHTNESS_TYPING_DOT(255-128)#define BRIGHTNESS_TYPING_TIRE(255-255)#define BRIGHTNESS_SLEEP_LOW(255-8)#define BRIGHTNESS_SLEEP_HIGH(255-128)* / // ======== ================================================== ================================================ //ピエゾスピーカーの設定。  // ================================================= ================================================== =============== #define PIEZO 12バイトpiezoData; 符号なしlong int piezoShutUpTime;  // ================================================= ================================================== =============== //モールス信号。  // ================================================= ================================================== =============== //これらのシンボルを使用して、ポイントとダッシュを指定します。  #define MORSE_DOT '*' #define MORSE_TIRE '-' //ポイントまたはダッシュはまだ入力されていません。  #define MORSE_EMPTY 0 //これは、レイアウトを変更するか、スリープモードを終了するときに、ドット/ダッシュの入力をブロックします。  #define MORSE_LOCKED '!'  //モールス符号文字の最大長(ドットとダッシュ)#define MAX_MORSE_SYMBOL_LENGTH 8 //モールス文字を書き込むためのバッファ。 バイトmorseSymbol [MAX_MORSE_SYMBOL_LENGTH];  unsigned int morseSymbolLen; バイトnewMorseSignal;  //新しく入力された信号はドットまたはダッシュです。  //モールス符号表。  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 TYPING_MODE 0 #define SLEEP_MODE 1 in  t mode; boolean flagWakeUp; //このフラグは、スリープモードを終了するために使用されます。 バイトledLevelSleepCounter;  //スリープモードで点滅するダイオードの輝度スイッチ。  // ================================================= ================================================== =============== void setup(){Serial.begin(9600);  pinMode(LED_R、出力);  pinMode(LED_G、出力);  pinMode(LED_B、出力);  //ボタンとLEDは両方とも反転ロジックで動作します。ボタンが押された= LOW、リリースされた= HIGH、// LEDは最大輝度= LOW、オフ= HIGHで点灯します。  LEDをオフにします:analogWrite(LED_R、255);  analogWrite(LED_G、255);  analogWrite(LED_B、255);  pinMode(PIEZO、OUTPUT);  digitalWrite(PIEZO、LOW);  pinMode(BUTTON_DOT、INPUT);  pinMode(BUTTON_TIRE、INPUT); ボタン= 0;  buttonsPrev = 0; モード= TYPING_MODE;  flagWakeUp = false;  morseSymbolLen = 0;  currentLayout = layoutLatin;  newLayout = 0;  newMorseSignal = MORSE_EMPTY;  ledLevelSleepCounter = 0;  } // ================================================ ================================================== =============== // //希望の色と明るさでLEDを点灯させます。 ロジックが反転し、0が最も明るい//ライトであり、255がオフLEDであることを忘れないでください。  void setLed(int ledColor、int ledBrightness){if(ledColor&COLOR_RED){analogWrite(LED_R、ledBrightness);  } else {analogWrite(LED_R、255);  } if(ledColor&COLOR_GREEN){analogWrite(LED_G、ledBrightness);  } else {analogWrite(LED_G、255);  } if(ledColor&COLOR_BLUE){analogWrite(LED_B、ledBrightness);  } else {analogWrite(LED_B、255);  }} // =============================================== ================================================== ================ //ピエゾスピーカーの使用void doPiezo(unsigned long int currentTime){if(currentTime> = piezoShutUpTime){if(piezoShutUpTime> 0){piezoShutUpTime = 0 ;  digitalWrite(PIEZO、LOW);  } return;  } piezoData =(piezoData == LOW)? 高:低;  digitalWrite(PIEZO、piezoData);  } void playPiezo(符号なしlong int t、符号なしlong int currentTime){piezoShutUpTime = currentTime + t;  } // ================================================ ================================================== =============== //コンタクトのバウンスの可能性を考慮して、ボタンの状態を読み取ります。  int getButtonState(int btnPrevState、int BUTTON_PIN、unsigned long int * timeDebouncing、unsigned long int currentTime){int btnState = digitalRead(BUTTON_PIN);  if(btnState == HIGH){if(btnPrevState == LOW){if(* timeDebouncing == 0){//ボタンが押される時間に注意してください-連絡先のバウンスとクリックを混同しないように。  * timeDebouncing = currentTime;  //プレスを認識しませんが、連絡先の跳ね返りを考慮します。  btnState = LOW;  } else {if((currentTime-* timeDebouncing)<DEBOUNCING_TIME){//現時点では、連絡先のバウンスを考慮して、クリックを認識しません。  btnState = LOW;  } else {//これは連絡先のチャットではなく、ボタンの実際のクリックです。  btnState = HIGH;  * timeDebouncing = 0;  }}} else {* timeDebouncing = 0;  }} else {if(btnPrevState == HIGH){if(* timeDebouncing == 0){//ボタンが押される時間に注意してください-クリックと連絡先のバウンスを混同しないように。  * timeDebouncing = currentTime;  //手放すことはありませんが、連絡先の跳ね返りと考えてください。  btnState = HIGH;  } else {if((currentTime-* timeDebouncing)<DEBOUNCING_TIME){//現時点では、リリースが連絡先のバウンスであると見なし、リリースを認識していません。  btnState = HIGH;  } else {//これは連絡先のバウンスではなく、実際のボタンスワイプです。  btnState = LOW;  * timeDebouncing = 0;  }}} else {* timeDebouncing = 0;  }} btnStateを返します。  } // ================================================ ================================================== ================ //入力した文字をコンピューターに送信します。  void sendMorseSymbol(){int i、j;  if(morseSymbolLen <1){return;  } playPiezo(50、millis());  for(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;  } // ================================================ ================================================== ================ //印刷モードvoidtypingLoop(){unsigned long int t、dt;  //これらの変数を時間測定に使用します。  int btnDotState、btnTireState;  //これらの変数では、ボタンの状態を考慮します。 原則として、ボタン変数に//すぐに入力することもできますが、この方法ではコードがより明確になります。  int ledLevel;  //ダイオードの輝度int ledColor;  //ダイオードの色、ビットマスク-00000RGB。  // analogWrite(PIEZO、0);  t =ミリ秒();  //ロジックが反転し、押されたボタンがLOWであることを忘れないでください。  btnDotState = getButtonState((buttonsPrev&BUTTON_DOT_MASK)?LOW:HIGH、BUTTON_DOT、およびtimeDotDebouncing、t);  btnTireState = getButtonState((buttonsPrev&BUTTON_TIRE_MASK)?LOW:HIGH、BUTTON_TIRE、およびtimeTireDebouncing、t); ボタン=((btnDotState == LOW)?BUTTON_DOT_MASK:0)|  ((btnTireState == LOW)?BUTTON_TIRE_MASK:0);  if(buttons == 0){//両方のボタンを離すと、入力したポイントを追加、ダッシュ、またはレイアウトを切り替えることができます。  //一時停止がSLEEP_TIMEより長い場合、スリープモードになります。  //ポーズがDELIMITER_TIMEより長い場合-キャラクターを送信します。  if(buttonsPrev!= 0){timeRelease = t;  } if(newLayout){currentLayout = newLayout;  newLayout = 0;  } elseスイッチ(newMorseSignal){case MORSE_DOT:case MORSE_TIRE:morseSymbol [morseSymbolLen ++] = newMorseSignal; 休憩;  // MORSE_DOT、MORSE_TIRE} newMorseSignal = MORSE_EMPTY;  dt = t-timeRelease;  if((morseSymbolLen> 0)&&(dt> DELIMITER_TIME)){sendMorseSymbol();  } else if(dt> SLEEP_TIME){mode = SLEEP_MODE;  Serial.println( "\ nスリープモード\ n");  }} else if(newMorseSignal!= MORSE_LOCKED){switch(buttons){case BUTTON_DOT_MASK:if(newMorseSignal == MORSE_EMPTY){//ドットが押された。  newMorseSignal = MORSE_DOT;  timePress = t;  } break;  // BUTTON_DOT_MASK case BUTTON_TIRE_MASK:if(newMorseSignal == MORSE_EMPTY){//ダッシュが押されています。  newMorseSignal = MORSE_TIRE;  timePress = t;  } break;  // BUTTON_DOT_MASKケースBUTTON_DOT_MASK |  BUTTON_TIRE_MASK://両方のボタンが押されました。 レイアウトを変更します。  switch(buttonsPrev){case 0://両方のボタンが同時に押されることはほとんどありませんが、この場合、キリル文字に切り替えます。  case BUTTON_DOT_MASK:if(newLayout == 0){sendMorseSymbol();  newLayout = layoutCyrillic;  Serial.println( "\ nLayout:キリル文字\ n");  } break;  // 0、BUTTON_DOT_MASKの場合BUTTON_TIRE_MASK:if(newLayout == 0){sendMorseSymbol();  newLayout = layoutLatin;  Serial.println( "\ nLayout:latin \ n");  } break;  // BUTTON_TIRE_MASK} timePress = t;  newMorseSignal = MORSE_LOCKED; 休憩;  // BUTTON_DOT_MASK |  BUTTON_TIRE_MASK}} // LEDをオンにします。  if(currentLayout == layoutCyrillic){ledColor = COLOR_CYRILLIC_LAYOUT;  } else {ledColor = COLOR_LATIN_LAYOUT;  } setLed(ledColor、(buttons == 0)?BRIGHTNESS_TYPING_LOW:((buttons == BUTTON_DOT_MASK)?BRIGHTNESS_TYPING_DOT:BRIGHTNESS_TYPING_TIRE));  doPiezo(t);  buttonsPrev =ボタン; 遅延(10);  } // ================================================ ================================================== =============== // //スリープモードvoid sleepLo​​op(){unsigned long int t、dt;  //これらの変数を時間測定に使用します。  int btnDotState、btnTireState;  //これらの変数では、ボタンの状態を考慮します。 原則として、ボタン変数に//すぐに入力することもできますが、この方法ではコードがより明確になります。  int ledLevel;  //ダイオードの輝度int ledColor;  //ダイオードの色、ビットマスク-00000RGB。  //スリープ状態です。したがって、ボタンのステータスを確認することはほとんどありません-0.3秒ごとに1回です。 遅延(300);  t =ミリ秒();  //ロジックが反転し、押されたボタンがLOWであることを忘れないでください。  btnDotState = getButtonState((buttonsPrev&BUTTON_DOT_MASK)?LOW:HIGH、BUTTON_DOT、およびtimeDotDebouncing、t);  btnTireState = getButtonState((buttonsPrev&BUTTON_TIRE_MASK)?LOW:HIGH、BUTTON_TIRE、およびtimeTireDebouncing、t); ボタン=((btnDotState == LOW)?BUTTON_DOT_MASK:0)|  ((btnTireState == LOW)?BUTTON_TIRE_MASK:0);  if(buttons!= 0){if(buttonsPrev == 0){timePress = t;  } //休止状態を終了するのに十分な長さのボタンが押されたかどうかを判断します。  if(!flagWakeUp &&((t-timePress)> = WAKEUP_TIME)){flagWakeUp = true;  }} else {if(buttonsPrev!= 0){timeRelease = t;  } if(flagWakeUp){//起きます。  flagWakeUp = false; モード= TYPING_MODE;  Serial.println( "\ nTYPING_MODE \ n"); 帰る  }} // LEDを点滅させます。  if(flagWakeUp){//現在のレイアウトに対応する色を点灯します。  if(currentLayout == layoutCyrillic){ledColor = COLOR_CYRILLIC_LAYOUT;  } else {ledColor = COLOR_LATIN_LAYOUT;  } ledLevel = BRIGHTNESS_TYPING_TIRE;  } else {ledColor = COLOR_SLEEP_MODE;  ledLevel =(ledLevelSleepCounter == 0)?  BRIGHTNESS_SLEEP_LOW:BRIGHTNESS_SLEEP_HIGH;  ledLevelSleepCounter = 1-ledLevelSleepCounter;  } setLed(ledColor、ledLevel);  buttonsPrev =ボタン;  } // ================================================ ================================================== ================ //メインループ。  void loop(){switch(mode){case TYPING_MODE:typingLoop(); 休憩;  case SLEEP_MODE:sleepLo​​op(); 休憩;  }} 



出来上がり! 私たちのデバイスは何ができますか? 左のボタンはポイントを示します。 右-ダッシュ。 この場合、押されたボタンのビートに合わせてダイオードが点滅します(ダッシュの場合-ポイントよりも明るい)。 左を押し、右を離さずに押すと、キリル文字(ダイオードの緑色)に切り替わります。 そして、右を押して、それを離すことなく、左を押します-ラテン語(黄色)。 ボタンが1分間押されないと、デバイスはスリープモードになり、ダイオードが紫色に点滅し始めます。



理論的には、キーボードの準備ができています。 しかし実際には、ブレッドボードにあるボタンをクリックするのはあまり便利ではありません。 デザインをより機能的な外観にしようとしましょう。



例として、私はCDの碑文のために古い乾燥したフェルトペンを取りました。 次回は、より容量の大きいケースを選択します。このような細いチューブに多数のワイヤを引き伸ばすのは非常に不便です。 そして、LEDから4つ、各ボタンから3つ、最大10個を取得します。 必要なワイヤと抵抗を各ボタンとダイオードにはんだ付けします。





(この写真では、電圧用のワイヤーとアース用のワイヤーを混ぜたようです-幸いなことに、何も燃え尽きませんでしたが、すべてをはんだ付けする必要がありました)



もちろん、3つの「電圧」と2つの「アース」を一緒にはんだ付けすることで最適化することはできましたが、フェルトペンの内側にすべてを取り付けることはより困難になります。 さらに、ボタンとダイオードをはんだ付けすると、さまざまなハウジングオプションとボタンとダイオードの配置を試すことができなくなります。 したがって、私は330オームの抵抗器と対応する色(R-オレンジ、G-緑、B-青)のワイヤを介してLEDのカソード、およびアノード-オレンジ-白にしゃがみました。 同じことが、10キロオームの抵抗と3本のワイヤーのそれぞれにはんだ付けされたボタンでも発生しました。アース(茶色)、電源(赤白)、およびArduinoピンへの接続用です。 ワイヤをはんだ付けする場合は、どの色に接続するかに注意を払う必要があります。そのため、ケースから出てくる数十本のワイヤを見ても、どれが何であるか推測できません。 裸線のテープを巻きました。 どうやら、Seeeduino Catalyst Packの一部である熱収縮チューブを使用してそれらを分離する方がより有能だろう。 これについて知識のある人に尋ねる必要があります:)



ボタンとダイオードをケースに入れる前に、はんだ付けした部品が機能することを確認しました。







すべて組み立て済み:







おそらく、結果のデバイスはベータ版と呼ばれる可能性があります。 この機能はほぼ完全に実装されており、クラフトを完成したデバイスに変えることが残っています。



モールスキーボードの次のバージョンでは、すべての電子機器が収まるより便利なケースを取り上げます(Arduinoのよりコンパクトなバージョンに切り替える必要があります)。 。



All Articles