編集履歴一覧に戻る
myaonのアイコン画像

myaon が 2021年02月28日15時40分13秒 に編集

初版

タイトルの変更

+

2進数アドベントケーキ🍰

タグの変更

+

Arduino_Nano

+

LED

+

秋葉原2021

メイン画像の変更

メイン画像が設定されました

本文の変更

+

エンジニア界隈ではクリスマスにアドベントカレンダーを通してブログ記事を公開する文化が浸透してきていますね。このアドベントカレンダーの文化をよりインタラクティブに体感するためにマイコンとLEDを用いた簡単なアドベントケーキを作りました。 完成品動画 https://youtu.be/rsNclRpT058 ハード設計はFusion360で行い、もともと単なるArduino Nanoの保護ケースとして設計していたものに、クリーム的な波とLED用の穴を加えてケーキらしくしました。 設計データ:https://a360.co/2rfe0O2 ![キャプションを入力できます](https://camo.elchika.com/c3e57492c36c5f8839b1a13d37eca3be25a7c415/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64656631306632662d356164392d343539322d613131332d6332353130373234613762322f62623666333734642d663461622d343265302d626533302d666633643763613464653634/) ![キャプションを入力できます](https://camo.elchika.com/43151589c0192c9b84f1dc0c19144f273666b01c/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64656631306632662d356164392d343539322d613131332d6332353130373234613762322f33666332393034312d373533632d346132332d383133632d653638636161386533346236/) 中身はこんな感じでArduinoUnoと小さめのブレッドボード、それに等間隔にLEDを指しています。 ![キャプションを入力できます](https://camo.elchika.com/74096214347cc2e5394d7b7653353bb2dc65b269/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f64656631306632662d356164392d343539322d613131332d6332353130373234613762322f64326636663930312d373136372d343632312d386161642d626166366336313538616537/) 回路的には結構怒られそうですが抵抗なしで各ピンをON/OFF切り替えするだけで、このサイズのシンプルな構造を実現しました。とりあえず燃え尽きることなく動いてたのでヨシ! プログラムはAruduino IDEで以下の通り。 ```arduino: int day=17; // 残り日数 int value[5]; int anode[]={11,8,5,2,0}; int casode[]={1,4,7,10}; void setup() { //Serial.begin(9600); pinMode(0, OUTPUT); //2^0 pinMode(1, OUTPUT); //GND pinMode(2, OUTPUT); //2^1 pinMode(4, OUTPUT); //GND pinMode(5, OUTPUT); //2^2 pinMode(7, OUTPUT); //GND pinMode(8, OUTPUT); //2^3 pinMode(10, OUTPUT); //GND pinMode(11, OUTPUT); //2^4 for(int p=0;p<4;p++){ digitalWrite(casode[p], LOW); } } /* 10進数-->2進数変換関数 */ void ChangeFunc( unsigned long int DecimalNumber, /* 10進数[in] */ char* BinaryString) /* 2進数文字列化[out] */ { int i,k; for(i = 0, k = 4; k >= 0; i++, k--) { if((DecimalNumber >> i) & 1)BinaryString[k] = '1'; else BinaryString[k] = '0'; } BinaryString[i] = '\0'; } void loop() { int i; char BinaryString[5]; /* 2進数文字列化 */ ChangeFunc( day, /* 10進数[in] */ BinaryString); /* 2進数文字列化[out] */ /* シリアルポートに文字列を出力 */ /*Serial.print(day, DEC); Serial.print("\n"); Serial.print(BinaryString); Serial.print("\n"); */ for(int i=0;i<5;i++){ if(BinaryString[i]=='1'){ digitalWrite(anode[i], HIGH); } else digitalWrite(anode[i], LOW); } delay(86400000UL); day = day-1; while(day<=0){ for(int s=0;s<5;s++){ digitalWrite(anode[s], HIGH); } delay(1000); for(int n=0;n<5;n++){ digitalWrite(anode[n], LOW); } delay(1000); } } ``` 2進数⇒10進数の変換は[こちらのサイト](https://webkaru.net/clang/decimal-to-binary/)のプログラムを参考にさせて頂きました。 シリアルポートを確認用に使っていましたがRX/TXのピンを出力に使っているため完成時にはコメントアウトしています。 delay(86400000UL); //1日分のdelay が無事に動いてくれてよかったです。