超音波噴霧器(アトマイザー)のマイコンからのコントロールを試しています。
→ 超音波噴霧器(アトマイザー)のモジュールを8ピンのATtiny202 でコントロールしてみた
市販のアトマイザーがLED光源で雰囲気を出しているのを見て,同じようにRGBカラーLEDをアトマイザーの周囲に配置して霧に色をつけてみました。
[試作セット]
・MPU:ATtiny202 (Arduino IDE)
・トランジスタアレイ:ULN2803AN
・超音波噴霧器(アトマイザー)のモジュール x4台
・WS2812B 8LED (NeoPixel) リングx4個
どういう配置にするかまだ決めていないので,混雑した仮配線が行き交っています(^^;;;;;;

アトマイザーはトランジスタアレイを介してモジュールの電源をコントロールし,またLEDリングはMPUから直にコントロールしています。
[プログラムでの色チェック]
アトマイザーからは連続して噴霧し,4台ともに同じ色を出力してチェックしてみました。

なかなか思ったような色にはなりませんが(^^;;;;;,雰囲気は出てきているようですかね。色の変化の動きを見ていると,アトマイザーのコントロールもゆっくりと変化するものにプログラムした方が似合いそうです。
LEDの防水も含めて吹き出し口など,機構もいろいろと工夫していきましょう(^^)。
以下,チェックプログラムをメモしておきます。
940byteぐらいの小さなプログラムですのでATtiny202でも十分余裕があります。
なお,NeoPixelのコントロール部分は随分前に作ったポートコントロール物です。
→ 超音波噴霧器(アトマイザー)のモジュールを8ピンのATtiny202 でコントロールしてみた
市販のアトマイザーがLED光源で雰囲気を出しているのを見て,同じようにRGBカラーLEDをアトマイザーの周囲に配置して霧に色をつけてみました。
[試作セット]
・MPU:ATtiny202 (Arduino IDE)
・トランジスタアレイ:ULN2803AN
・超音波噴霧器(アトマイザー)のモジュール x4台
・WS2812B 8LED (NeoPixel) リングx4個
どういう配置にするかまだ決めていないので,混雑した仮配線が行き交っています(^^;;;;;;

アトマイザーはトランジスタアレイを介してモジュールの電源をコントロールし,またLEDリングはMPUから直にコントロールしています。
[プログラムでの色チェック]
アトマイザーからは連続して噴霧し,4台ともに同じ色を出力してチェックしてみました。

なかなか思ったような色にはなりませんが(^^;;;;;,雰囲気は出てきているようですかね。色の変化の動きを見ていると,アトマイザーのコントロールもゆっくりと変化するものにプログラムした方が似合いそうです。
LEDの防水も含めて吹き出し口など,機構もいろいろと工夫していきましょう(^^)。
以下,チェックプログラムをメモしておきます。
940byteぐらいの小さなプログラムですのでATtiny202でも十分余裕があります。
なお,NeoPixelのコントロール部分は随分前に作ったポートコントロール物です。
// ATtiny202 Atomizer & NeoPixel_LED Control
// Atomizer controll Pin: pin_number 0,1,2,3
// NeoPixel WS2812B Pin: PA3(PORTA bit 3, pin_number 4)
// Number of LED_Group: 4
// Number of LED in one Group :8
#define groupnumber_max 4
#define numberinGroup 8
// LED data:number of LED_Group x RGB(3) byte
byte aData[groupnumber_max][3];
void setup() {
for (byte i=0; i < 5; i++){ // init. output
pinMode(i,OUTPUT);
digitalWrite(i,LOW);
}
delayMicroseconds(50); // reset Neopixel
// LED All Clear(r,g,b =0)
allset(0,0,0); sendData(); delay(500);
for (byte i=0; i < 4;i++){ // atomizer start
digitalWrite(i,HIGH);
}
delayMicroseconds(1000); // waiting
}
void loop(){
byte r,g,b;
int waitms=7000;
r=0x8F;g=0x00;b=0x00; allset(r,g,b); sendData(); delay(waitms); // R
r=0x00;g=0x8F;b=0x00; allset(r,g,b); sendData(); delay(waitms); // G
r=0x00;g=0x00;b=0x9F; allset(r,g,b); sendData(); delay(waitms); // B
r=0x8F;g=0x8F;b=0x00; allset(r,g,b); sendData(); delay(waitms); // R+G
r=0x8F;g=0x00;b=0x8F; allset(r,g,b); sendData(); delay(waitms); // R+B
r=0x00;g=0x8F;b=0x8F; allset(r,g,b); sendData(); delay(waitms); // G+B
r=0x8F;g=0x8F;b=0x8F; allset(r,g,b); sendData(); delay(waitms); // R+G+B
}
void allset (byte ar,byte ag,byte ab){
for (byte i=0; i < groupnumber_max; i++){ // Make LED all the same color
aData[i][0]=ag;
aData[i][1]=ar;
aData[i][2]=ab;
}
}
void sendData(){
noInterrupts();
for (byte numLed=0; numLed < groupnumber_max; numLed++){
for (byte g_loop=0; g_loop < numberinGroup; g_loop++){
for (byte rgbLed=0; rgbLed <3; rgbLed++){
byte a=aData[numLed][rgbLed];
for (byte i=0; i<8; i++){
byte hl=a & 0x80;
if (hl>0){
PORTA.OUT=PORTA.OUT | B00001000; // HIGH
PORTA.OUT=PORTA.OUT | B00001000; // HIGH
PORTA.OUT=PORTA.OUT | B00001000; // HIGH
PORTA.OUT=PORTA.OUT & B11110111; // LOW
}else{
VPORTA.OUT=VPORTA.OUT | B00001000; // HIGH
VPORTA.OUT=VPORTA.OUT | B00001000; // HIGH
VPORTA.OUT=VPORTA.OUT | B00001000; // HIGH
VPORTA.OUT=VPORTA.OUT | B00001000; // HIGH
VPORTA.OUT=VPORTA.OUT | B00001000; // HIGH
VPORTA.OUT=VPORTA.OUT & B11110111; // LOW
PORTA.OUT=PORTA.OUT & B11110111; // LOW
}
a=a*2;
}
}
}
}
interrupts();
}