読者です 読者をやめる 読者になる 読者になる

プログラミング素人のArduino

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

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

さらにリモコン解析。

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;

}

ぶろぐ引越しとシンタックスハイライト

ブログ

アメブロで書いていたこのブログですが、広告がうっとうしいのとシンタックスハイライトが使えないので「はてな」に引越しすることにした。
s.ameblo.jp

引越し自体はこのサイトを参考にするとほぼ問題なくできた。

georges.hatenablog.jp

ただ、最後のはてなダイアリーからはてなブログへの移行は、ここに書かれている方法は実行できなかった。
もっと単純に、インポートしたブログがそのままブログになっているようだ。
ここで、ドメインが hatenadiary になっているが、仕様のようだ。
ためしに、hatenablogのドメインでブログを新しく作っても、記事に書かれているようにdiaryからの移行はできなかった。
ドメインとしてdiaryを残したまま、機能的にはhatenablogに統一されたと考えられる。

そして、シンタックスハイライト。
公式の手引きをみてもなぜかできない。

その他の先行事例をぐぐると、どうやら記法に関連があるようで、はてな記法にしたらできた。
公式のほうにもそのように書いておいて欲しい。
さらには、インポートした記事は「推奨記法」になっているのでこれを後に変更することはできないらしい。

インポートした過去記事を編集でシンタックスハイライトにはできないということになる。
編集中の記事はここで記法を変更できる。
f:id:s51517765:20160919125846p:plain

一つ一つ新規記事として再度投稿し、投稿日時を編集していくしかないようだ。
(どこまでやるかは追々)

void main(){
void シンタックスハイライトのテスト
}

Amazon Linkのテスト

リモコン解析

Arduino

昨日の応用で、リモコン解析をします。

タクトスイッチでHIGH or LOW を作っていたところに、赤外線センサを取り付けます。
いくつかあらかじめ入手しておいた赤外線センサを使いますが、今日は昨日紹介したものがどこかにまぎれて見つからなかったので、SPS-442-1(38kH)を使いました。

akizukidenshi.com

昨日のタクトスイッチのdigitalReadにセンサの Vout を接続し、GNDとVCCを接続します。

Vout とはセンサ出力がでる端子、またはその出力のことをいい、VCCは動作電源です。

VCCはArduino の5Vに接続します。

このセンサは足が5本出ていますが、どの足がどの端子であるかはDataSheetをみれば分かります。購入したときについている場合もありますが、ついていなければ型番でぐぐるとすぐに見つかります。
ためしに動作させようとすると、何も受信していないのに波形が出てきました。
f:id:s51517765:20160919122219p:plain

よく分からないですが、一定の周期のHIGH / LOWです。

この後リモコン信号を受信させてみると、とくに問題なく受信できていそうなので、とりあえず良しとします。わからないけど。18000μsぐらいの周期でした。

良しとした根拠としては、リモコンを受信させてみると↓のように波形が取れていると判断したからです。
ちなみにPanasonicVIERAです。
f:id:s51517765:20160919122247p:plain

いくつかのボタンを試してみると、とても似通った波形が出てきます。
これは間違いなく違うパターンであるがその差はとても小さいように見えます。
ちょっと、プログラムを改良する必要がありそうです。

まず、信号を見ると、長いHIGHがあったあと、HIGH / LOWのパターンがあります。これをボタンが押されている間繰り返すようです。
おそらく、この長いHIGHがスタートでしょう。

この部分はだいたい75,000~81,000μsぐらいあるので、すこし余裕をとって70,000μs以上HIGHであれば記録開始するようにして、だいたい2回分が拾えるように17stepでstopするようにします。

f:id:s51517765:20160919122327p:plain

できたようなできてないような。

unsigned long time_m = 0;
unsigned long time_n = 0;
unsigned long time_nagasa = 0;
unsigned long time_total = 0;
unsigned long time_start = 0;
unsigned long time_start_section = 0;
int i = 0;

void setup() {

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

void loop() {
  while (digitalRead(4) == HIGH) { //HIGHであったら
    time_start = micros(); //start時刻を記憶し
    while (digitalRead(4) == HIGH) {
      time_start_section = micros() - time_start; //start区間の長さを測る
    }
  }

  if (time_start_section > 70000) {
    Serial.print("START  = ");
    Serial.println("0,0,1");
    time_total = time_total - time_start;
    for (i = 1; i < 14; i++) { //繰り返し範囲設定 無限繰り返し
      while (digitalRead(4) == HIGH) {}
      time_m = micros();
      time_nagasa = time_m - time_n; //スイッチが押下されていない時間を算出
      time_total = time_total + time_nagasa;

      Serial.print("---  = ");
      Serial.print("  ");
      Serial.print("--- ");
      Serial.print(",");
      Serial.print(time_total);
      Serial.println(",1");
      Serial.print("LOW  = ");
      Serial.print(time_nagasa);
      Serial.print(",");
      Serial.print(time_total);
      Serial.println(",0");
      delayMicroseconds(20);
      while (digitalRead(4) == LOW) {}
      time_n = micros();
      delayMicroseconds(20);
      time_nagasa = time_n - time_m; //スイッチが押下されて離された時間を算出
      time_total = time_total + time_nagasa;
      Serial.print("---  = ");
      Serial.print("  ");
      Serial.print("--- ");
      Serial.print(",");
      Serial.print(time_total);
      Serial.println(",0");
      Serial.print("HIGH = ");
      Serial.print(time_nagasa);
      Serial.print(",");
      Serial.print(time_total);
      Serial.print(",");
      Serial.println("1");
    }
  } //end if
  while (Serial.available() == 0) {
    Serial.println("Hit any key to start...     ");
    delay(100);
  }
} //end loop

Arduinoで時間を計る その2

Arduino

今日は、前回続きです。
スイッチが押下されている時間を計測します。
下図のようなプルアップ回路を作って、タクトスイッチが押されている時間を計測します。
(Input I/Oが3だったり4だったりしますがあしからず)

f:id:s51517765:20160919131858j:plain

スイッチが押されれていないと、digitalReadはHIGHです。 

while (digitalRead(4) == HIGH) {} 

whileは()のなかの条件が成立している間、{}のなかを実行しますが、ここでは{}の中を空欄にすることで、digitalRead(4) == HIGH のあいだ、ここに留まります。
スイッチが押されて、digitalRead == LOWとなると、このwhileを抜けて、

time_m = micros();//スイッチが押され始めた時刻<200b>

に進みます。
次に

while (digitalRead(4) == HIGH) {} 

に進みdigitalRead(4) == LOW となるとこのwhileを抜けて
time_n = micros(); //スイッチが離された時刻
に進みます。
この時刻の差が 押下されている時間になります。

unsigned long time_m = 0;
unsigned long time_n = 0;
unsigned long time_nagasa = 0;
 
void setup() {
  pinMode(4, INPUT);
  Serial.begin(57600);
}
 
void loop() {
  while (digitalRead(4) == HIGH) {}
  time_m = micros(); //スイッチが押され始めた時刻
  delayMicroseconds(20); //チャタリング対策
  while (digitalRead(4) == LOW) {}
  time_n = micros(); //スイッチが離された時刻
  delayMicroseconds(20);
  time_nagasa = time_n - time_m; //スイッチが押下されて離された時間を算出

  delayMicroseconds(20);
  Serial.print("ms =");
  Serial.println(time_nagasa);
}

これを繰り返すことで、押された時刻、離された時刻を次々取得することを考えます。
ExcelなどにSerial出力を貼り付けられるように、HIGH or LOW、それぞれの継続時間、total時間、 HIGH = 1、LOW = 0を 「,」(カンマ)区切りで出力します。
カンマ区切りを入れることで、Excel上で 「区切り位置」 を設定することで、グラフ作成が容易になります。

unsigned long time_m = 0;
unsigned long time_n = 0;
unsigned long time_nagasa = 0;
unsigned long time_total = 0;
int i = 0;
void setup() {
  pinMode(4, INPUT);
  Serial.begin(57600);
}
void loop() {
  Serial.print("START  = ");
  Serial.println("0,0,1");
  for (;;) { //繰り返し範囲設定 無限繰り返し
    while (digitalRead(4) == HIGH) {}
    time_m = micros();
    time_nagasa = time_m - time_n; //スイッチが押下されていない時間を算出
    time_total = time_total + time_nagasa;
    Serial.print("---  = ");
    Serial.print("  ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.println(",1");
    Serial.print("LOW  = ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.println(",0");
    delayMicroseconds(20);
    while (digitalRead(4) == LOW) {}
    time_n = micros();
    delayMicroseconds(20);
    time_nagasa = time_n - time_m; //スイッチが押下されて離された時間を算出
    time_total = time_total + time_nagasa;
    Serial.print("---  = ");
    Serial.print("  ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.println(",0");
    Serial.print("HIGH = ");
    Serial.print(time_nagasa);
    Serial.print(",");
    Serial.print(time_total);
    Serial.print(",");
    Serial.println("1");
  }
}

f:id:s51517765:20160919132403p:plain
ここまでできたら、ほぼ完成したも同然。
次は赤外線リモコン解析をします。

Amazonで買える、赤外線センサー。