プログラミング素人のArduino

技術屋の末端。プログラミングは専門外。 電気回路も専門外です。 コードに間違いなど見つけられたら、気軽にコメントください。 VC#、ラズパイ始めました。

Win10にArduino IDEを導入

Win10 タブレットを入手した。

Asus Transbook T102HA


↓多分このへんだと思う。 (Link修正1/10)

似たような機種がいくつかあるようなので一応、手元のスペックを張り付けておく。
f:id:s51517765:20170110165700p:plain

これにarduino開発環境IDEを導入した。

特になにも考えることなく公式ページからWindowsIDEをdownloadし動作させることが出来た。

結果的に↓のページと同じことを行ったようで、これが再現したということになる。

http://blog.goo.ne.jp/pearlwing/e/3565bb55ba2a28d245bb32185a839055

100均フルカラーLED

100円でフルカラーに点灯するLEDを発見。
f:id:s51517765:20161230111757j:plain

これは、3本足のフルカラーLEDが入っているに違いない!

と思って買ってきて分解してみるも、制御IC内臓のタイプだった。

f:id:s51517765:20161230111949j:plain
f:id:s51517765:20161230111957j:plain

ほんとにこれだけですよ。なんとまぁ。

f:id:s51517765:20161230112040j:plain
こいつも同様。

100均常夜灯の改造

100円で買った(ダイソー)照度センサーで点灯する常夜灯があるのだが、
朝も昼も夜もほぼ常時点灯になっていた。

これを感度調整して、適切に消点灯させたい。

f:id:s51517765:20161225173525j:plain

カバーをあけてみると思いのほか部品が多い。
f:id:s51517765:20161225173446j:plain

f:id:s51517765:20161225173556j:plain

100VACからLEDの点灯の2VDCを得ることが一番の目的で、照度センサ(CDS)でトランジスタを制御し、ON/OFFとなるようにしているようだ。

f:id:s51517765:20161225173612j:plain

f:id:s51517765:20161225173603j:plain

すでに先人が分解した記録がるのでこれを参考に、回路を推定した。
本当はプリント基板を解読すれば解るのだが、2面(両面)基板のため、素人には解読が難しかった。
sites.google.com

推定回路が↓のような感じではないかと
f:id:s51517765:20161225182218p:plain

オレンジで囲んだ部分が、突入電流回避回路。
交流であり、しかも100Vであり、LEDにとっては大きな電圧なので、コンデンサを入れることでこれを軽減できる。
抵抗は実測していないが、引用先よりこれぐらいの大きさかと。

赤で囲んだ部分がブリッジダイオードといって、交流からLED点灯用の直流を得る回路である。
ダイオードは決まった向きにしか電流を流さないことから、整流回路ともいう。

AC電源なので、電源端子は+と-が入れ替わる。
プラスはまあいいとしても、マイナスがくると困る。
なので、マイナスのときは回路を入れ替えて電流を欲しい向きに誘導してやるようなイメージである。

たとえば、回路図の上側の電源端子が+であるときは、上側端子 → D1 → LED → D2 →下側端子という風に流れる。
一方、回路図の下側が +であるときは、 下側端子 → D4 → LED → D3 → 上側端子という風に流れる。
ダイオードは反対極性の電流にたいしては絶縁のように振舞う)

そして、CDSをつかったON/Off回路は、CDSは明るいとき抵抗が低く暗いとき抵抗が高い。
これが逆の特性を持っていれば、LEDに直列につないだ単純な回路でOn/Offが実現できるのだが、現実は不幸にも逆だ。

そこで、LEDをNPNトランジスタで駆動することを考える。
NPNのベース電圧をCDSとR1で分圧し、CDSの抵抗が高くなる(暗くなる)とベースがhighになってLEDを駆動すればよい。

f:id:s51517765:20161225184600j:plain
CDSに光を当てながらテスターで抵抗を測り、また、LEDのOn/offと光の強さを観測すると、大体40kΩ以上となったときLEDが点灯することを突き止めた。
しかしながら、通常使用している環境ではCDSはつねに40kΩ以上であった。
つまりグラフでいうと、CDSの青線において、40kΩを境にした右上の領域しか実現しないのである。

CDSはこの40kΩ以上であるが、合成抵抗で40kΩの前後を動くようにしてやればよい。
そこで、回路図の水色のように100kΩの抵抗をCDSに並列に接続すると、合成抵抗は赤線のようになる。
カバーをあけた状態ではんだ付けができるので、↓のようにつけた。
f:id:s51517765:20161225185446j:plain

このようにすると、CDSは40kΩ以上なのだが、合成抵抗が40kΩの前後を動くようになる。
並列の合成抵抗の計算は (A * B) / (A+ B)Ωであるので
(CDS * 100k) / (CDS + 100k)Ω として、CDSの抵抗に対しプロットした。
 
ちなみに、青色LEDが煌々と煌くのもいまいちなので、黄色LEDに変えた。

完成。

EOL

私ももっぱら利用しているNPNトランジスタが 東芝の2SC1815である。

じつはこいつ、生産終了宣言がされている。
といっても、私が確認できたのは EOL announced(生産終了予定)であるが。
EOL とはEnd of Life のことで、所謂ディスコンである。

これが2011年のこと。

現実的にはまだまだ、Amazonでも取り扱いが残っているから、実際使えなくなるのはもっと先なのかもしれないが。
独占禁止法てきな理由から同じ性能とされる製品は他社からも出ているが、半導体部品に限らないが同じ仕様のものでも動作が同じとは限らない。
たとえば、お薬の先発品とジェネリックもそうである。

ジェネリックとは「有効成分」が同じであるだけの、言ってみれば「別物」である。
先発品が多額の開発費をかけて開発したもので、一方ジェネリックは特許公開情報をもとに、2ndメーカーが同じ効能をめざして作ったものである。
よって、開発費が少なくてすむため価格は安くできる。

生産の現場では、その材料の変更についても簡単には行わないのが通常である。(アジアメーカーなどで品質に関する考え方が甘い会社ではそうでもないこともあるが)

高分子の世界ではCASがおなじでも、メーカーが違えば別物とみなされる。
CASとは化学物質を特定するための番号である。
CAS登録番号 - Wikipedia

つまり、レシピが同じでも材料が違うし作り手が違うし、鍋がちがうし、作り方が違う。
これを4Mと言ったりする。

・Man (人)
・Machine (機械)
・Material (材料)
・Method (作り方)

の頭文字をとったもので、逆に言えばこれが違ったら「モノ」を疑えということになる。
日ごろ安定した品質の製品が、安定した品質を保っているのは、メーカーがこのようなことにまで気を使っているからなのである。

アマチュア電子工作が脅かされることはいまのところなさそうではあるが、部品が変わったら動作が変わらないか気をつけなければならない。

私は、まだトランジスタの品質が影響を及ぼすような高度なものは作っていないが。

はんだ付け

今日ははんだつけとはんだこてについて書きたいと思います。
はんだこてですが、gootのKX-30という30Wのものを使っています。
Amazonでさがすと、同じものは見つかりませんでした。
↓だと40Wです。

わたしが使っている感覚では、この前の電子ホタルの回路のような 0.5mmのリード線を使うにはこの30Wでも少し温度が高い気がします。これでも、水を含ませたスポンジで冷やしながら使っています。

温度の高い状態で使っているためか、小手先がぼろぼろになりました。
f:id:s51517765:20161127181942j:plain

これも、Amazonで買えるので小手先を交換しました。
f:id:s51517765:20161127182558j:plain
綺麗になりました!!

小手先が荒れてくると、はんだが小手に乗り難くなるので、やはり悪くなったら交換すべきです。
それどころか私のは先端が大きく欠けていました。

はんだ付けは、私は職務上の専門ではないのですが、専門の方にもアマチュアとしては上手い、といわれたので、電子ホタルのはんだ付け一部始終をアップ。

f:id:s51517765:20161127183014j:plain
f:id:s51517765:20161127183410j:plain
まず基板の上に部品を載せます。この時点で裏にはんだで固定していますが、この先の配線を動画で。

電子ホタル

電子ホタルを作ってみました。

LEDがまるでホタルをのように見える、LEDが点滅する回路のことです。

これまで、LEDを点滅させるにはArduinoなどでタイマーをセットする方法ができましたが、
今回はアナログにトランジスタコンデンサによる振動回路によって実現しました。

f:id:s51517765:20161127172510j:plainf:id:s51517765:20161127172502j:plain

空き瓶に入れたらクリスマスの電飾っぽくならないかな?
f:id:s51517765:20161127172650j:plain

回路図は↓
f:id:s51517765:20161127172545p:plain

左半分だけでも点滅回路が成立します。
f:id:s51517765:20161127172903p:plain

簡単に、仕組みを説明しますと、R1、R2、R3はLEDのための制限抵抗。
ここでは、一応100Ωとしていますが、使っているLEDにあわせて選定します。
僕はいつも使っているLEDですが、明るさを出したいと考えこの抵抗は省いています。
このときはこの抵抗を R1=R2=R3=0Ωとみなしてください。

可変抵抗VRはそれぞれLEDの点滅の周期に影響します。
だいたい47kΩ前後で周期を変化させる実験をしたいと思ったので、 VR1=VR=2=56kΩ、VR3=200kΩの最大値となる可変抵抗を使いました。
結果をさきにいうと、200kΩは大きすぎて感度がないので、すべて47kΩぐらいがよいかもしれません。
抵抗は実測値です。購入したときの仕様がよく区別つかないので。

コンデンサ電荷をためるというのは中学か高校の理科でも習うと思いますが、
両端に印可した電圧を最大値として、充電がすすむと最終的に電流が流れなくなります。
電流が流れ始めたときは抵抗は0とみなすことができ、最後には抵抗無限大となります。
可変抵抗VRはこのコンデンサに流れる電流を制御します。
可変抵抗が大きければ、コンデンサの充電はゆっくりになります。

コンデンサに電流が流れている間は、反対側のトランジスタのベースがHIGHになっていて、流れなくなるとLOWになります。
ベースがHIGHであれば、エミッタコレクタ間が導通しLEDが点灯し、ベースがLOWになるとLEDが消灯します。
このとき、コレクタに接続しているコンデンサ電荷がにげて、電位が下がっていきます。
このとき、コンデンサは片側だけ充電がのこるということはありません。
すると、このコンデンサに接続しているトランジスタのベース電位が下がって、offになります。

この仕組みについては、私も完全には理解していませんが、↓が詳しいです。
無安定マルチバイブレータ(トランジスタ・タイプ) 回路説明

LEDはピンヘッダのメスを使うことで、色を任意に変更できるようにしました。

そして、出来上がったのが↓

リモコン解析2

さらにリモコン解析。

Arduinoでリモコン解析をしている例をいろいろ調べていると、もっと分かりやすくデータを取得できるんじゃないかと思えてきました。
単純に、一定時間ごとに出力を観測し、HIGH = 1 、LOW = 0として吐き出してくれば、その様子が見れるんじゃないかと。

また、リモコンには通常、スタートとストップ(または信号の終わり)を示すきまったパターンがあるということなので、
これを利用するともっとスマートに信号が取れそうということで。

マイコンの実験:赤外線通信実験2

ここを参考に、スタートは3.3m以上のLOWとした。
(引用元は3.4msとしているが、とくにこの差に深い意味はない)

  if (digitalRead(4) == LOW) { //リーダ部のチェック
    t = micros() ;
    while (digitalRead(4) == LOW) ; // HIGHになるまで待つ
    t = micros() - t ;     // LOWの部分をはかる
    
  }

  // リーダ部有り(3.3ms以上のLOWにて判断する)
  if (t > 3300)
 {

このように3.3ms以上のLOWがあったときを起点とする。

 for (i = 1; i < n; i++) {
   
      if (digitalRead(4) == LOW) {
        state[i] = 1;
        i++;
      }
      else {
        state[i] = 0;
        i++;
      }
      delayMicroseconds(80);
    }

つぎに、digitalReadがLOWかそうでない(HIGH)かによって、 1 or 0を吐き出す。
気持ちdelayを入れる。

delayMicroseconds(80);

delayは信号がうまく違いを取れることを目的に調整する。
ここでは、テレビのリモコンを使っているが、 1~12までの数字を押してみて、違いが現れるものをえらぶ。

なぜか少し大きめの数字のほうが上手くとれた。

   for (i = 1; i < n - 1; i++) {
      Serial.print(state[i]);
      Serial.print(",");
    }
    Serial.println(state[i]);
  }
  t = 0;

}

最後にまとめて、Printする。

printlnに限らないが、このような処理は時間を要してしまうので、samplingをしながら出力を行おうとすると、時間にずれが生じてしまうのは、以前書いた。
delayMicroseconds を利用しているときは特にである。

ここで変数としてstate[i] というものを定義した。
iには整数が入り、state[1], state[2], state[3], ...というような連続する変数を作ることができる。これは「配列」という。
ここでは、これに digitalReadの結果として、1 or 0 を連続的に格納する。
これを200個用意した。

unsigned long state[200];

[]の200が200こという意味になる。

unsigned long i = 0;
unsigned long t;
unsigned long state[200];
int n = 200; //繰り返し回数
void setup() {

  pinMode(4, INPUT);
  Serial.begin(9600);
}

void loop() {

  t = 0 ;

  if (digitalRead(4) == LOW) { //リーダ部のチェックを行う
    t = micros() ;
    while (digitalRead(4) == LOW) ; // HIGHになるまで待つ
    t = micros() - t ;     // LOWの部分をはかる
    
  }

  // リーダ部有り(3.3ms以上のLOWにて判断する)
  if (t > 3300) {
    for (i = 1; i < n; i++) {
   
      if (digitalRead(4) == LOW) {
        state[i] = 1;
        i++;
      }
      else {
        state[i] = 0;
        i++;
      }
      delayMicroseconds(80);
    }
 //   Serial.println(t); //デバック
    for (i = 1; i < n - 1; i++) {
      Serial.print(state[i]);
      Serial.print(",");
    }
    Serial.println(state[i]);
  }
  t = 0;

}