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   中身はこんな感じでArduinoUnoと小さめのブレッドボード、それに等間隔にLEDを指しています。  回路的には結構怒られそうですが抵抗なしで各ピンを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 が無事に動いてくれてよかったです。