ドングル型の超小型のAruduino互換機を分解してみた
前から気になっていたArduino互換機。Arduino互換機のほとんどは基板むき出しなのに、これは、ちゃんとケースに入っている。しかもUSBメモリみたいなケース。金属製のケースで高級感まである。
どう見てもUSBメモリだ。この中にATmega32U4が入っていて、Arduino leonardo互換機のブートローダーが入っている。Arduino IDEでプログラミングが可能だ。
PCに差し込むと、Arduino leonardoとして認識する。
Arduino IDEでキーボードとして認識して勝手にタイピングするプログラムを書き込んでみた。
Arduino IDEでは、「ツール」→「ボード」に「Arduino Leonardo」を選択し、コンパイルします。
プログラムは、例によって超小型のArduinoを買ってみたと同じものです。
PCに差して5秒後に、文字を勝手に打つ迷惑プログラムです(笑)
#include <Keyboard.h> char Str[ ] = "warewareha ucyu-zinda."; void setup() { Keyboard.begin(); } void loop() { delay(5000); int i; for (i = 0; i < sizeof(Str) - 1; i++) { Keyboard.print(Str[i]); delay(500); } while(true){ } }
さて、この中身がどうなっているのか気になります。分解してみましょう。
ペンチで無理やり引き抜いたところ。
基板を抑えている爪を伸ばしたら基板が出せそうです。
引き出した基板。チップにクッションが挟まっていて、引き抜くのに苦労しました。
クッションを剥がしました。写真ではチップの型番が見えませんが、ATmega32U4のようです。
裸の基板のまま、USBを接続してみると、LEDが付いている事に気が付きました。調べてみると13番ピンに繋がっているようです。Lチカもできました。
いくつかのピンも両面スルホールとして出ているので、ケースに収められるのであれば、何か部品を追加できそうです。標準でスイッチ1つぐらいは付けてほしかったなあ。。。。。
ケースは、強固な金属ですので気合を入れて加工できれば、用途は広がりそうです。
なかなか面白そうな商品でした。
超小型のArduinoを買ってみた
2センチほどしかありません。超小さいです。しかも基板の部分がそのままUSB端子に刺さります。これでArduinoと同等の性能というのがすごいです。
ピン配列を見てみると、汎用IOの数はArduinoより少なくはなっていますが、SPIやI2C、アナログ、シリアル、PWMなど豊富にピンに上がっているのがわかります。いろいろな機能を使って中・大規模な使い方ではなく、ちょっとしたネタ工作みたいな単機能に絞ったものであれば、十分かと思います。
温度・湿度センサーをつけてもいいですし、GPSセンサーをつけてもよさそうです。マイコンには、ATmega32U4を使用しているので、キーボードにしたりマウスに出来たりと用途が広がりますね。
センサーが反応すると、文字を打ち込むようになるとかでもよさそうです。
Arduino IDEでは、「ツール」→「ボード」に「Arduino Leonardo」を選択し、コンパイルします。
#include <Keyboard.h> char Str[ ] = "warewareha ucyu-zinda."; void setup() { Keyboard.begin(); } void loop() { delay(5000); int i; for (i = 0; i < sizeof(Str) - 1; i++) { Keyboard.print(Str[i]); delay(500); } while(true){ } }
パソコンに刺すと基板がキーボードとして認識され、5秒後にStrで設定した文字が一文字一文字打たれていきます。なにもしていないのに文字が打たれていくのが、ちょっと気持ちが悪いですね(笑)
スイッチやセンサーをつければ、人のアクションに対して文字を打ったりマウスを動かしたりする事もできそうです。
Duinofun NeoPixel shieldをArduinoで使ってLED派手にキラキラ
Arduino UNOの上に差し込むだけ、5×8のフルカラーLEDマトリクスシールドのDuinofun NeoPixel shieldを使ってLEDをキラキラさせてみたいと思います。
Arduino UNOに差し込んだ状態。ぴったりきているのですが、
電解コンデンサのパッケージにピンが接触するようです。一応問題はなさそうですが。。。まあいいか。
最近のボードだとコンデンサが内側に引っ込んだから大丈夫みたいだけど。。。。
また、全LEDをフルパワーで光らせると500mA以上の電流を消費するので、USB電源だけでは足りなくなるようです。ArduinoのDCプラグやシールドの電源INから電源を供給しましょう。
Githubにライブラリがありますので、「Clone or download」から「Download ZIP」を選択し、ZIPファイルをダウンロードしておきます。
Arduino IDEの1.6.11を使用しています。
「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール...」を選択し、先ほどダウンロードしたAdafruit_NeoPixel-master.zipをインポートします。
ボードは「Arduino/Genuino Uno」を選択。
COMポートをちゃんと選択します。
とりあえず、細かい事はさておき光らせたい方は、以下のこのサンプルプログラムをコピペしてArduinoに書き込みをしてみてください。
なかなか綺麗ですね。このプログラムは、いくつかのパターンで光るようです。
さて、プログラムの説明をしていきます。シンプルで動くプログラムを作ってみました。
#include <Adafruit_NeoPixel.h> #include <avr/power.h> #define PIN 6 //NeoPixelの設定ピン #define NUMPIXELS 40 //LEDの個数 //ライブラリの定義 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 500; // ディレイ(ミリ秒) void setup() { pixels.begin(); //ライブラリの初期設定 } void loop() { for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,0,150)); // カラーをセット(R,G,B) pixels.show(); // セットされたカラーを表示 delay(delayval); // ディレイ } for(int i=0;i<NUMPIXELS;i++){ pixels.setPixelColor(i, pixels.Color(0,0,0)); // カラーをセット(R,G,B) pixels.show(); // セットされたカラーを表示 delay(delayval); // ディレイ } }
キモはこのあたりです。
pixels.setPixelColor(i, pixels.Color(0,0,150));
i はLEDの位置です。
iの値は、この写真の番号になります。
pixels.Color(0,0,150)は、LEDの色を指定します。R,G,Bの順番になっており、0~255までの値を指定します。255が一番明るい値です。
次の
pixels.show();
ですが、セットしたLEDの位置とカラーを表示します。show()する前に、setPixelColorを複数指定することも可能です。
それを踏まえて適当なサンプルはこちら
#include <Adafruit_NeoPixel.h> #include <avr/power.h> #define PIN 6 //NeoPixelの設定ピン #define NUMPIXELS 40 //LEDの個数 //ライブラリの定義 Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800); int delayval = 50; // ディレイ(ミリ秒) byte R_Pixel[5][84] = { {255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,236,225,202,191,167,154,128,114, 92, 66, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 57, 91,105,119,145,158,182,194,215,227,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, {255,255,255,255,255,255,255,255,255,255,255,255,255,255,253,236,225,202,191,167,154,128,114, 92, 66, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36, 57, 91,105,119,145,158,182,194,215,227,248,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255}, {206,206,206,206,206,206,205,205,205,205,205,204,204,204,200,187,177,159,150,130,120, 99, 88, 70, 49, 34, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25, 43, 70, 81, 91,113,123,142,152,170,179,195,205,204,204,205,206,205,206,206,206,205,206,206,206,206,206}, {149,149,149,149,150,149,149,149,149,149,148,148,148,148,145,134,128,115,107, 94, 86, 70, 62, 48, 33, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15, 29, 47, 57, 65, 81, 88,102,109,122,129,142,149,149,149,149,149,149,149,149,149,150,150,150,149,150,149}, { 86, 86, 86, 86, 86, 85, 85, 85, 85, 85, 85, 84, 85, 84, 83, 77, 73, 65, 60, 52, 47, 38, 33, 24, 16, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 6, 11, 24, 29, 35, 44, 48, 57, 61, 69, 73, 81, 85, 85, 85, 85, 85, 85, 85, 86, 86, 85, 85, 85, 86, 85, 86} }; byte G_Pixel[5][84] = { { 31, 48, 59, 86, 99,110,135,147,169,180,200,211,232,241,251,251,251,251,251,251,251,250,250,250,250,250,250,250,251,251,250,251,251,251,251,252,252,252,253,252,253,253,244,234,214,203,183,172,150,139,115,105, 92, 69, 60, 47, 48, 48, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 58, 59, 56, 53, 51, 47, 46, 42, 41, 37, 37, 34, 33, 32, 32, 31}, { 31, 48, 59, 86, 99,110,135,147,169,180,200,211,232,241,251,251,251,251,251,251,251,250,250,250,250,250,250,250,251,251,250,251,251,251,251,252,252,252,253,252,253,253,244,234,214,203,183,172,150,139,115,105, 92, 69, 60, 47, 48, 48, 48, 49, 50, 50, 51, 52, 53, 54, 55, 56, 58, 59, 56, 53, 51, 47, 46, 42, 41, 37, 37, 34, 33, 32, 32, 31}, { 22, 35, 45, 66, 77, 86,104,114,131,141,158,167,184,191,199,199,199,198,198,198,198,198,198,198,198,198,198,198,198,197,198,198,199,198,198,199,199,200,200,199,200,200,192,184,168,160,143,134,117,108, 90, 81, 71, 53, 45, 35, 36, 36, 36, 37, 37, 37, 39, 39, 39, 40, 41, 42, 43, 44, 42, 39, 38, 36, 34, 32, 30, 28, 26, 25, 24, 23, 22, 22}, { 13, 23, 29, 45, 53, 61, 74, 82, 95,101,114,120,133,138,144,144,144,144,143,144,144,143,144,143,143,144,143,143,144,143,144,144,144,144,144,145,144,144,145,145,145,145,139,133,122,115,103, 97, 84, 77, 63, 56, 50, 35, 30, 22, 23, 23, 23, 23, 24, 24, 25, 25, 26, 26, 27, 28, 29, 29, 28, 26, 24, 22, 21, 20, 19, 17, 16, 15, 14, 13, 13, 12}, { 4, 9, 13, 23, 27, 31, 40, 44, 53, 56, 65, 68, 76, 79, 82, 82, 83, 83, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 83, 83, 82, 82, 82, 83, 80, 76, 69, 65, 57, 54, 45, 42, 33, 29, 26, 17, 13, 8, 8, 9, 8, 9, 9, 9, 10, 9, 10, 11, 11, 11, 12, 12, 12, 10, 10, 8, 8, 7, 7, 6, 5, 5, 4, 4, 4, 4} }; byte B_Pixel[5][84] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 61, 78, 99,120,133,157,169,193,203,225,235,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,225,214,192,180,157,146,119,106, 85, 62, 43, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21, 61, 78, 99,120,133,157,169,193,203,225,235,252,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,243,225,214,192,180,157,146,119,106, 85, 62, 43, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 46, 58, 76, 92,103,123,132,151,160,176,186,200,203,202,203,203,203,203,203,203,203,204,203,203,204,203,204,203,203,203,203,203,203,203,202,202,203,203,202,203,191,177,169,152,141,123,113, 92, 82, 65, 46, 32, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 32, 41, 53, 66, 72, 88, 95,108,116,127,134,145,147,147,147,147,147,147,148,148,147,148,148,147,147,147,147,147,148,147,147,148,147,147,147,147,147,148,147,147,139,128,121,108,101, 88, 81, 65, 58, 45, 32, 20, 0, 0}, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 13, 20, 27, 35, 39, 47, 53, 61, 65, 72, 77, 82, 84, 84, 84, 84, 84, 84, 84, 84, 85, 84, 84, 85, 84, 84, 84, 85, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 80, 72, 69, 60, 56, 48, 44, 36, 29, 22, 13, 7, 0, 0} }; void setup() { pixels.begin(); //ライブラリの初期設定 pixels.show(); // 表示をクリア } void loop() { int Num = sizeof R_Pixel[0] /sizeof R_Pixel[0][0]; for(int i=0;i<Num;i++){ for(int y=0;y<5;y++){ for(int x=0;x<8;x++){ int xy = x + (y * 8); int x_s = x + i; if(x_s > Num - 1){ x_s = x_s - Num; } int R = R_Pixel[y][x_s]; int G = G_Pixel[y][x_s]; int B = B_Pixel[y][x_s]; pixels.setPixelColor(xy, pixels.Color(R,G,B)); } } pixels.show(); // セットされたカラーを表示 delay(delayval); // ディレイ } }