更新滞っていますが、日々プログラムばかりしてブログ更新用のネタがありませんw
プログラムでも色々とハマってたのですが、それは次回に置いておいて、今回はエンジン部分のLEDについてです。
アシェットも1/20バルキリーと同様に脚の部分にもarduinoを1枚入れることとなりました。
そこでは、
①ステップモーター
②メインギアモター
③ランディングライト
④編隊灯
⑤エンジンLED通常時
⑥エンジンLEDアフターバーナー時
の制御を行います。
で、曲者がエンジンのLED達です。
エンジン通常時のLEDがオレンジの常時点滅で、アフターバーナー時は明るさが増します。
リアルにはそんな感じなんでしょうが、模型的にはちょっと物足りないwww
せっかくなら1/20みたいにNeoPixel仕込んで派手目にしてみたいww!
まずはプログラム的にステップモーターと共存出来るかどうか?
ダメならステップモーターをAVRを増設で任すという方法も有りますが、できたらパーツ増やしたくないw
とりあえず試してみましたwこちらの2つの動画をご覧ください。(5秒ぐらい見たら十分ですよw)
何の違いも無い動画に見えますが、この2つの動画大きな違いがあるんですよ!!!
正解は
上がステップモーターがタイマー割込み
下がNeoPixelがタイマー割込み
はいww
分かるかよ!!!
の突っ込みありがとうございますww
でもね、微妙にですがステップモーターがタイマー割込みの方がステップモーターを手に持ってみるとの動きがなめらかなのが感じられます。(動画ではわかりませんw)
それにNeoPixelのタイマー割込みはこの単純な明滅ならいいけど、エンジンスタート時のちょっと複雑な動きになるとプログラムが超込み入ってくるw作ってはみましたけどねww
なんか簡単にタイマー割込みプログラム作ったように書いていますが死ぬほどハマってますからwwwww
その辺は次回にw
てなことでステップモーター、DCモーターの待ち時間をタイマー割込みで処理することにしました。このおかげでステップモーターとDCモーターを同時に動かすことも可能になったのでラッキーw
というわけでソフト的には出来ること確認しましたのでハードの方作りましょう!
まずはLED並べてと
6個位が丁度良さそう。
右の物は以前F-8クルセイダーを作る時に挫折したNeoPixelを配置したリングw
コイツからLED剝ぎ取って使用します。
1mmプラ板にコイツで傷をつけて(ここからは備忘録用w)
傷の部分で割って取り出します。
L字の定規を固定して45度の位置にマジックで印を
プラ板に45度の位置で線を引きます。
6分割にしますから60度の角度が必要ですので、先ほどの線が90-(60-45)=75度の角度になるように先ほどの線を合わせます。
また45度の点とを結ぶ線を書き加えます。
また先ほどの繰り返し
はい、これで6分割。、正確に分割して
LED貼り付けでいい加減とwww!
だってwハンダ付け部分が干渉しちゃうんだものww光る部分さえあの線上に有ればオッケーでしょwww
NeoPixelはこんな感じで数珠繋ぎ
本来コンデンサー等を取り付けるように仕様書には書いてありますが面倒で省略ww
とりあえず点灯
オッケ~。
2個目はちょっとましになりましたw
プラ板上の配線は動かないように布ボンで固定
上手くエンジン部分に仕込めました^^
こんな感じになりま~す。
で、実際のこの足部分のモーター類等の制御もありプログラムは込み入っていますので、Neopixel部分のみのarduinoのスケッチ載せておきます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
#include <Adafruit_NeoPixel.h> #define PIN 13 #define NUMPIXELS 6//LEDの個数 Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUMPIXELS , PIN, NEO_GRB + NEO_KHZ800); //------------------------------------------------------------------------- #define engine 2 #define after 3 int a,e,k; byte LED_normal,LED_aft; //---------------------------------------------------------------------- void engin_step(int t){ k++; if(k>=25){k=25;}//25ステップでcolor(200,60,0)になります for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(250-k*2, 12/5*k, 0)); int j=i-1; if(j<0){j=5;} strip.setPixelColor(j,strip.Color(k*8, 12/5*k, 0)); strip.show(); delay(t); } } void engin_start(){ k=0; for(int i=0;i<=25;i++){ engin_step(25-i); } } void engin_normal(){ strip.setBrightness(200); e^=1; if(e==1){ for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(200,60, 0)); strip.show(); } } else { for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(0,0, 0)); strip.show(); } } delay(6); } void after_1(int t){ for(int h=0;h<=20;h++){ strip.setBrightness(55+10*h); for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(200+h/2,60+h*2,h*11)); strip.show(); } delay(t); } for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(210,100,220)); strip.show(); } delay(500); } void after_2(){ strip.setBrightness(255); a^=1; if(a==1){ for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(210,100,220)); strip.show(); } } else { for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(105,50,110)); strip.show(); } } delay(8); } //================================================================-- void setup() { Serial.begin (9600); pinMode(engine,INPUT_PULLUP); pinMode(after,INPUT_PULLUP); //--------NeoPixel-------------------------------- strip.begin(); strip.setBrightness(150); for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(0,0,0)); strip.show(); } } //============================================================= void loop() { if(LED_normal!=1 && LED_aft!=1){ if(digitalRead(engine)==0){engin_start(); LED_normal=1; } } if(LED_normal==1){ if(digitalRead(engine)==0){engin_normal();} if(digitalRead(engine)!=0){LED_normal=0; for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(0,0,0)); strip.show(); } } if(digitalRead(after)==0) {LED_normal=0; after_1(30); LED_aft=1; } } if(LED_aft==1){ if( digitalRead(engine)==0 && digitalRead(after)==0) {after_2(); } if(digitalRead(engine)==0 && digitalRead(after)!=0) {LED_aft=0; LED_normal=1; } if(digitalRead(engine)!=0 && digitalRead(after)!=0) {LED_aft=0; LED_normal=0; for(int i=0;i<=NUMPIXELS;i++){ strip.setPixelColor(i,strip.Color(0,0,0)); strip.show(); } } } } |
Adafruit_NeoPixel.hライブラリーを入れてからコンパイルしてくださいね~。
接続はプログラムで分かると思いますが。
NeoPixelの信号線 → D13
エンジン通常時のスイッチ →D2
アフターバーナー時のスイッチ → D3です。
後は好きに数字をいじって自分好みにして下さい。
関連すると思われる記事:
- None Found
おつかれさまっす。
せっかく均等分割したのに、LEDの取り付けでwww
透明なプラ板に薄く分割線入れて、LEDオモテ面をそこに均等貼り付けしてから
配線すればよかったのにー。
Arduinoによる疑似マルチタスクは、ぐぐってみたらTimedActionというライブラリがあるみたいですね。この辺使ってプログラム中なのかな?
gyoさん こんにちは!
そっかw
透明プラ板使う方法があったかw!
その方法ならちょっと円形のままでは奥に押し込めないのでプラ板の加工が必要ですが、配線とか断然楽そうww早く言ってよ!!って無理かww
TimedActionもプログラムがすべて終わってからブログ書くにあたって調べてみて初めて知りましたww
それ使えばもう少し楽できたのかもですが、色々ハマって結構得るものも多かったので良しとしますw
光っちゃえば目くらましになってそんな樹脂部分の取り付け角度の差なんか見えない見えないw
リアルかどうかは置いといて噴射炎が回転するのって、我々世代がヤマト脳なのかも、もちろん私も大好きですよ(^^)
Timer割り込み使えたらArduinoのプログラムも調整が楽になりそうな気がするけど大変だったんですね~、種明かしを待ってます!
なおさん こんばんは!
だよね~光物は多少の問題は飛んじゃいますからww
そもそも拡散板も有って外から見えませんしねw
そうなのよ~なんかこういうエンジンって回ってくれないと気が済まないww
ヤマトの影響か( ̄▽ ̄)
今回は100μ秒のタイマーを作ってそこに載せてタイマー割り込みでやってみました~!