1/fゆらぎでLチカ

投稿日:

 さて、他の人もよくやっている「1/fゆらぎのLチカ」を、私もマネしてやってみる。

 こちらこちらのサイトを参考にさせていただく。よく使われるのはこの「間欠カオス法」だそうである。

間欠カオス法
0.0\leqq x\leqq 1.0として
x<0.5のときx=x+2x^2
x\geqq 0.5のときx=x-2(1-x)^2

 ただし、参考にさせていただいた各サイトによると、この間欠カオス法は、0.0付近や1.0付近に値が貼り付き易いので、0.0や1.0に近くなったら乱数を入れてやるとよいとのことである。実際に試すと、たしかに、長時間ちらつきがなくなったり、消えたままになったりしやすい。そこで、そうなったときに乱数を入れ、中間付近の適当な輝度で光らせるようにしてある。

 青色要素を少なくして、ろうそくの色合い風なちょっと黄色味がかった色にした。

//
//  f1Fluctuation.ino
//    1/fゆらぎでLチカ
//    佐藤俊夫
//    27.06.28(日)1700~
//
const int R = 9, G = 10, B = 11;
//
void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() {
  int f = 0.0;
  
  f = f1Fluctuation();
  analogWrite(R, 255 - f);
  analogWrite(G, 255 - f);
  analogWrite(B, 255 - (f * 0.2));
  delay(20);
}


int f1Fluctuation(){
  static float x = 0.1;
  if(x < 0.5){
    x = x + 2 * x * x;
  } 
  else {
    x = x - 2 * (1.0 - x) * (1.0 - x);
  }
  if(x < 0.05 || x > 0.995){
    x = random(10, 90) / 100.0;
  }
  return((int)(x * 255));
}



今度は鬱陶しく

投稿日:

 今度はできるだけ鬱陶しく汚くLEDを光らせてみた。 見ていて疲れる。

//
//  badLight.ino
//    今度は3色LEDをできるだけ鬱陶しく汚く光らせたい。
//    佐藤俊夫
//    27.06.28(日)
//
const int R = 9, G = 10, B = 11;
//
void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() {
  digitalWrite(R, random(2));
  digitalWrite(G, random(2));
  digitalWrite(B, random(2));
  delay(100);
}



蛇の目にLED

投稿日:

 3色・ドライバICなしのLED。Arduinoは20mAくらいしか電流が流せないから、光らせるのに各色いちいち抵抗を付けなければならず、そのたびにブレッドボードでチマチマやるのが面倒くさい。

 それで、昨日作ったAC100Vオンオフモジュールの余りの蛇の目基盤に、同じく余りのピンヘッダと抵抗をつけて、LED基盤にした。

IMG_3055
IMG_3056

 シンプルになって、なかなか良い。



美しくLチカ

投稿日:

 3色LEDにサインカーブでPWMをかけ、できるだけ美しく色変化をかけたい。実はこれは前にもやったが、もうちょっとコードを美しくしたいのであった。

 3項演算子があったらなあ……。

//
//  sinCurvePWM.ino
//    3色LEDをできるだけ幻想的に美しく光らせたい。
//    佐藤俊夫
//    27.06.27(土)
//
const int R = 9, G = 10, B = 11;
//
void setup() {
  pinMode(R, OUTPUT);
  pinMode(G, OUTPUT);
  pinMode(B, OUTPUT);
}

void loop() {
  static float thetaR = 0.0, thetaG = 0.0, thetaB = 0.0;
  const float PI2 = 2.0 * PI;
  const float Rtic = PI2 / 1000.0, Gtic = PI2 / 900.0, Btic = PI2 / 1100.0;
  
  thetaR += Rtic;
  thetaG += Gtic;
  thetaB += Btic;
  if(thetaR >= PI2) thetaR = 0.0;
  if(thetaG >= PI2) thetaG = 0.0;
  if(thetaB >= PI2) thetaB = 0.0;
  analogWrite(R, 255 - sin255(thetaR));
  analogWrite(G, 255 - sin255(thetaG));
  analogWrite(B, 255 - sin255(thetaB));
  delay(20);
}

int sin255(float theta){
  return((int)((sin(theta) + 1.0) * 127.5));
}



あー、銭ゲバっぽく

投稿日:

 Arduinoで株価の監視、とかもゲスっぽくていいなあ。……アクチュエータはLEDとかじゃなくってさ、ソレノイドでピンが抜けて、鉄槌みたいなものがドガッ!!って振り下ろされるワケよ。

メールサーバお知らせランプ

投稿日:

 今朝の着想、「Arduinoのメールサーバお知らせランプ」というのを実際に作った。

 自分のプロバイダのメールサーバを定期的に監視して、メールがたまっていなければ緑、少し多ければ黄、たまりすぎていれば赤、早急に読み出さなければならないようなら赤の点滅、というふうに、ランプで知らせてくれるのである。

 以前作った「未読メールメータ」とは違って、「ETHERNET SHIELD 2」を使って単独でネットにつながるように作ってあり、パソコンを立ち上げたりサーバを上げたりする必要はないので、使い方も単純だ。電源をつなぎ、そのへんにのたくっているカテ5のケーブルを突っ込めば終わりである。

 まず、100円ショップで買ったアクリルの枠にEHTERNET SHIELD 2を取り付けたArduino UNOをねじ止めする。

 LEDは昨日も使ったアノードコモンのものを、大きく見えるよう、これまた100円ショップで買ってきたピンポン玉の中に封入し、クリップでアクリルの枠にとりつける。

 RGBそれぞれのピンをデジタルの3,4,5番につなぎ、アノードに+5Vを加える。それぞれのピンに330Ωの抵抗を付けておくことを忘れてはならない。

組み付けた様子
IMG_3023

 回路図については、描くほどのものではないが、まあ、描けばこうなる。

回路図
mailLampCircuit

 そうすると、メールの量に応じて、こんな具合に光り方が変わる。

メール10通以下は緑
IMG_3019

メールが50通くらいまでは黄
IMG_3021

メールが100通近くなってくると赤、100通を超えると赤点滅
IMG_3022

 写真の彩度が悪いが、実物はもっと鮮やかな色に見える。

 スケッチはこんな感じだ。

//
//  メールの残りによりランプの色を変える。
//    佐藤俊夫
//    27.06.14(日) 1500~
//
#include <SPI.h>
#include <Ethernet2.h>

byte MAC[] = {
  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74
};
IPAddress IP(192, 168, 1, 129);
IPAddress MY_DNS(192, 168, 1, 1);
EthernetClient CLIENT;
const char MAIL_SERVER[] = "pop.hogehoge.ne.jp", USER[] = "USER hoge@pop.hage.ne.jp", PASS[] = "PASS passpass";
unsigned long LAST_CONNECTION_TIME = 0;
const unsigned long CONNECTION_INTERVAL = 300L * 1000L;
int R = 0, G = 0, B = 0;
const int LEDR = 3, LEDG = 4, LEDB = 5;
unsigned long LAST_LED_BLINK_TIME = 0;
boolean LED_BLINK_RED = true;
const int LED_BLINK_INTERVAL = 1000;
int MAIL_NUM = 0;
String RECEIVE_STR = "";

void setup() {
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
  digitalWrite(LEDR, HIGH);
  digitalWrite(LEDG, HIGH);
  digitalWrite(LEDB, HIGH);
  delay(1000);
  Ethernet.begin(MAC, IP, MY_DNS);
}

void loop() {
  if (CLIENT.available()) {
    char c = CLIENT.read();
    RECEIVE_STR += c;
  }
  if (millis() - LAST_CONNECTION_TIME > CONNECTION_INTERVAL) {
    pop3connect();
    if(RECEIVE_STR.indexOf("+OK server ready\r\n+OK ") >= 0){
      RECEIVE_STR = RECEIVE_STR.substring(RECEIVE_STR.indexOf("+OK server ready\r\n+OK ") + 22);
      RECEIVE_STR = RECEIVE_STR.substring(0, RECEIVE_STR.indexOf(" "));
      MAIL_NUM = RECEIVE_STR.toInt();
    }
    RECEIVE_STR = "";
  }
  if(MAIL_NUM <= 10){
    digitalWrite(LEDR, HIGH);
    digitalWrite(LEDG, LOW);
    digitalWrite(LEDB, HIGH);
  }else
  if(MAIL_NUM <= 50){
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDG, LOW);
    digitalWrite(LEDB, HIGH);
  }else
  if(MAIL_NUM <= 100){
    digitalWrite(LEDR, LOW);
    digitalWrite(LEDG, HIGH);
    digitalWrite(LEDB, HIGH);
  }else
  if(MAIL_NUM > 100){
    if(millis() - LAST_LED_BLINK_TIME > LED_BLINK_INTERVAL){
      if(LED_BLINK_RED){
        digitalWrite(LEDR, HIGH);
        digitalWrite(LEDG, HIGH);
        digitalWrite(LEDB, HIGH);
        LED_BLINK_RED = false;
      }else{
        digitalWrite(LEDR, LOW);
        digitalWrite(LEDG, HIGH);
        digitalWrite(LEDB, HIGH);
        LED_BLINK_RED = true;
      }
      LAST_LED_BLINK_TIME = millis();
    }
  }
}
void pop3connect() {
  CLIENT.stop();
  if (CLIENT.connect(MAIL_SERVER, 110)) {
    CLIENT.println(USER);
    delay(1000);
    CLIENT.println(PASS);
    delay(1000);
    CLIENT.println("STAT");
    delay(1000);
    CLIENT.println("QUIT");
    delay(1000);
    CLIENT.println();
    LAST_CONNECTION_TIME = millis();
  }
}


ArduinoでPOP3サーバを監視

投稿日:

 この前作った「未読メールメータ」は、次のような仕組みだった。

  •  ArduinoをLinuxサーバのシリアルに接続
  •  Linuxサーバのcronを使い、定期的にプロバイダのメールサーバを監視
  •  未読メールの数をシリアルに出力
  •  Arduinoにつなげたサーボモータを未読メールの数に応じて駆動

 この時には「ETHERNET SHIELD 2」は持っていなかったので、ネットに接続するためにLinuxサーバを使わざるを得なかった。

 しかし、「ETHERNET SHIELD 2」を使えば、直接POP3サーバにアクセスして、例えば昨日やったLEDの色替えで、未読メールの数を色で表示することなどができそうだ。

  •  0通 緑
  •  ~10通 黄
  •  ~50通 赤
  •  100通~ 赤点滅

……みたいなことをやれば、Arduinoで完結できて、なかなか面白いかもしれない。



ブレボー

投稿日:

 ブレッドボード、略して「ブレボー」というのはこういうもののことである。

IMG_3004

……この右側の、輝いているLEDが取り付けられている、小穴が無数にあいたもののことだ。この小穴の中は縦横に接続されており、この小穴に部品やリード線を差し込むことによって電子回路が仮組みできるのである。

 これを「ブレッドボード Bread board」という理由が、なにやら面白いのでメモしておく。

 Bread board というのは、本当はコレのことだそうな。

 これすなわち、「打ち台」、パンを打つときに使うアレのことなのだそうな。

 昔の電子回路は真空管で、多少の漏電はかまわなかったので、この「まな板」状のものを買ってきて、釘を適当に打ち付け、そこに銅線を巻き付けて回路のテストをしたから、そういう仮組み板のことをブレッドボードと呼んでいたのが定着したのだそうである。

 

LEDをネットにつないでコントロール

投稿日:

 先週少しやりかけて途中だった、Arduino UNO に ETHERNET SHIELD 2 をとりつけ、ウェブインターフェイスを作ってこれでLEDをコントロールするという遊びの続きをやる。

 こんなふうなインターフェイスでコントロールすることにする。

名称未設定 1

 で、ブレッドボードとArduinoはこんな感じ。「SeeedStudio SIDEKICK BASIC KIT」に入っていた3色LEDを使う。

IMG_3004

 スケッチはこんな感じで。ウェブ上で同じようなことを公開している方々は、ブラウザの出力を受けるのに、たいてい普通のポインタ文字列を使っておられるのだが、せっかくStringクラスがあるので、それを活用することにした。Stringクラスを使う欠点は多少メモリを浪費することだが、反面、余裕は十分あり、今回は別にメモリが足りないというわけでもないので、そうした。

//
//  Web2TriColorLED.ino
//    27.06.07(日) 1800~
//    佐藤俊夫
//    3色LEDをウェブインターフェイスで制御
//    ETHERNET SHIELD 2 使用
//
#include <SPI.h>
#include <Ethernet2.h>
//
byte mac[] = {
  0x90, 0xA2, 0xDA, 0x0F, 0xF6, 0x74
};
IPAddress ip(192, 168, 1, 129);
EthernetServer SERVER(80);
EthernetClient CLIENT;
int R = 0, G = 0, B = 0;
const int LEDR = 3, LEDG = 5, LEDB = 6;
//
void setup() {
  Ethernet.begin(mac, ip);
  SERVER.begin();
  pinMode(LEDR, OUTPUT);
  pinMode(LEDG, OUTPUT);
  pinMode(LEDB, OUTPUT);
}


void loop() {
  char c;
  String rstr = "";
  CLIENT = SERVER.available();
  if (CLIENT) {
    while (CLIENT.connected()) {
      if (CLIENT.available()) {
        c = CLIENT.read();
        rstr += c;
        if(rstr.endsWith("\r\n")){
          break;
        }
      }
    }
    if(rstr.indexOf("red=") >= 0){
      R = rstr.substring(rstr.indexOf("red=") + 4, rstr.indexOf("&green=")).toInt();
      G = rstr.substring(rstr.indexOf("green=") + 6, rstr.indexOf("&blue=")).toInt();
      B = rstr.substring(rstr.indexOf("blue=") + 5, rstr.indexOf("&end")).toInt();
    }
    analogWrite(LEDR, R);
    analogWrite(LEDG, G);
    analogWrite(LEDB, B);
    delay(10);
    rstr = "";
    sendform();
    // give the web browser time to receive the data
    delay(1);
    // close the connection:
    CLIENT.stop();
  }
}
//
void sendform(){
  char* formFirstHalf[] = {
    "<html>",
    "  <head>",
    "    <meta charset=\"utf-8\">",
    "  </head>",
    "  <body>",
    "    <center>",
    "      <h1>Arduino 3色LEDをウェブインターフェイスで</h1>",
    "      <form method='GET'>",
    "        <table>",
    "          <tr>",
    "  	    <th style='background-color:red;  color:white;'>赤</th>",
    "  	    <th style='background-color:green;color:white;'>緑</th>",
    "  	    <th style='background-color:blue; color:white;'>青</th>",
    "	  </tr>"
  };  //  14 num.
  char* formSecondHalf[] = {
    "        </table>",
    "        <input type='hidden' name='end'>",
    "        <input type='submit' value='セット'>",
    "      </form>",
    "    </center>",
    "  </body>",
    "</html>"
  };  // 7 num.
  int i = 0;

  CLIENT.println("HTTP/1.1 200 OK");
  CLIENT.println("Content-Type: text/html");
  CLIENT.println("Connection: close");
  CLIENT.println();
  CLIENT.println("<!DOCTYPE HTML>");
  for(i = 0; i < 14; i++){
    CLIENT.println(formFirstHalf[i]);
  }
  CLIENT.println("          <tr>");
  CLIENT.println("            <td>");
  CLIENT.println("              <select name='red'>");
  for(i = 0; i <= 255; i++){
    CLIENT.print("                <option value='");
    CLIENT.print(i, DEC);
    if(i == R){
      CLIENT.print("' selected>");
    }else{
      CLIENT.print("'>");
    }
    CLIENT.print(255 - i, DEC);
    CLIENT.println("</option>");
  }
  CLIENT.println("              </select>");
  CLIENT.println("            </td>");
  CLIENT.println("            <td>");
  CLIENT.println("              <select name='green'>");
  for(i = 0; i <= 255; i++){
    CLIENT.print("                <option value='");
    CLIENT.print(i, DEC);
    if(i == G){
      CLIENT.print("' selected>");
    }else{
      CLIENT.print("'>");
    }
    CLIENT.print(255 - i, DEC);
    CLIENT.println("</option>");
  }
  CLIENT.println("              </select>");
  CLIENT.println("            </td>");
  CLIENT.println("            <td>");
  CLIENT.println("              <select name='blue'>");
  for(i = 0; i <= 255; i++){
    CLIENT.print("                <option value='");
    CLIENT.print(i, DEC);
    if(i == B){
      CLIENT.print("' selected>");
    }else{
      CLIENT.print("'>");
    }
    CLIENT.print(255 - i, DEC);
    CLIENT.println("</option>");
  }
  CLIENT.println("              </select>");
  CLIENT.println("            </td>");
  CLIENT.println("          </tr>");
  for(i = 0; i < 7; i++){
    CLIENT.println(formSecondHalf[i]);
  }

}

 気を付けるところは、私が買った「SeeedStudio SIDEKICK BASIC KIT」というキットに入っている3色LEDは「アノードコモン(共通陽極)」というタイプで、プラスに5V、各色のコントロールはマイナスになる、という点だ。ここを間違えると思ったように動作しない。一番長い脚が共通陽極だ。封入の切り欠きを左にして、左から赤、アノード、緑、青の順に脚が並ぶ。

 また、フォームから与える値も、アノードコモンであるゆえに、「0」が最も明るくなり、「255」が最も暗くなるので、インターフェイスを逆にするなど、多少工夫が必要だ。

 それから、PWM(パルス幅変調)の機能を大いに活用し、いろいろな色が出せるようにした。この場合の注意点は、ETHERNET SHIELD 2を取り付けると、10番・11番・12番のピンが使えなくなるので、他のピンで出力しなければならないことだ。今回は3番・5番・6番を使った。

 で、ウェブインターフェイスをタブレットにロードする。

IMG_3005

 動かしてみるとこんな感じで、いろんな色になって面白い。


3色入りLED

投稿日:

 あ、そうだ、最初に買ったキットの中に3色入りのLEDがある。アレを、Webインターフェイスでコントロールするのも面白そうだな……。イーサネットシールド2もあるし。