「電子工作」カテゴリーアーカイブ

二酸化炭素センサー MH-Z19 のPWM入力プログラムを割り込み処理で実現

二酸化炭素センサー MH-Z19 のPWM入力でデータを取得したくて
Arduino用のサンプルプログラムを使ってみたのですが、
このプログラムPWMのパルス長の計測をメイン処理の中でやっていたので、
このままでは他のセンサーとの併用が難しいので、データ取得部分を割り込み処理に変更してみました。

割り込みには「MsTimer2」ライブラリを使用しています。
またデータのフィルタリングテストの処理も追加しています。

公開されていた元のプログラム

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
#define pwmPin A0
#define LedPin 13
 
int prevVal = LOW;
long th, tl, h, l, ppm;
 
void setup() {
  Serial.begin(9600);
  pinMode(pwmPin, INPUT);
  pinMode(LedPin, OUTPUT);
}
 
void loop() {
  long tt = millis();
  int myVal = digitalRead(pwmPin);
 
  if (myVal == HIGH) {
    digitalWrite(LedPin, HIGH);
    if (myVal != prevVal) {
      h = tt;
      tl = h - l;
      prevVal = myVal;
    }
  }  else {
    digitalWrite(LedPin, LOW);
    if (myVal != prevVal) {
      l = tt;
      th = l - h;
      prevVal = myVal;
      ppm = 5000 * (th - 2) / (th + tl - 4);
      Serial.println("PPM = " + String(ppm));
    }
  }
}

割り込みによる処理に変更したプログラム

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
/*
  MH-Z19
  Intelligent Infrared CO2 Module
 
  MsTimer2 is a small and very easy to use library to interface Timer2 with
  humans. It's called MsTimer2 because it "hardcodes" a resolution of 1
  millisecond on timer2
  For Details see: http://www.arduino.cc/playground/Main/MsTimer2
 
  2017/08/20
  NextStep/Kaz Ueno
*/
 
#include <MsTimer2.h>
 
/* Switch on LED on and off each half second */
 
#define     LedPin 13                               /* LED to pin 13 */
#define     pwmPin A0                               /* CO2 data input to pin A0 */
 
boolean     prevVal = LOW;
 
uint32_t    CO2_data = 0L;
uint8_t     data_count = 0L;
 
uint32_t    th, tl, h, l, ppm, ppm_now;
 
uint32_t    ppm_befor = 0L;
uint32_t    tt = 0L;
 
 
 
void flash()
{
  uint8_t myVal = digitalRead(pwmPin);
 
  tt++ ;
  if (myVal == HIGH) {
    digitalWrite(LedPin, HIGH);
    if (myVal != prevVal) {
      tl = tt ; 
      prevVal = myVal;
      tt =0L;
    }
  }  else {
    digitalWrite(LedPin, LOW);
    if (myVal != prevVal) {
      th = tt; 
      prevVal = myVal;
      ppm = 5000 * (th - 2) / (th + tl - 4);
      ppm_now = ppm_befor * 0.8 + ppm * 0.2 ;
      ppm_befor = ppm_now;
      data_count++ ;
      CO2_data += ppm_now;
      tt = 0L;
    }
  }
}
 
void setup()
{
  Serial.begin(9600);
  pinMode(pwmPin, INPUT);
  pinMode(LedPin, OUTPUT);
 
  MsTimer2::set(1, flash);                            // 1ms毎に割り込みを発生させる
  MsTimer2::start();
  delay(5000);
}
 
void loop()
{
  uint32_t    CO2_data_ave;
  CO2_data_ave = CO2_data / data_count;
  Serial.println("PPM = " + String(CO2_data_ave) +"," + String(ppm_now) +"," + String(ppm));
  CO2_data = 0L;
  data_count = 0L;
 
  delay(5000);
}

I2C UART 変換IC SC16IS750

I2C UART 変換IC SC16IS750を使ってみた。

Arduino(ATMEGA328P-PU)を使っているとシリアルポートが足りない事ありますよね。
センサー類はI2C対応が多いけど
GPSモジュールとかはシリアルでしか信号出ていないし。

今回そんな悩みを解消してくれる【I2C UART 変換IC SC16IS750】を使ってみました。

テストしたモジュールは
Switch science の https://www.switch-science.com/catalog/2310/ です。
このボードは I2C固定でデフォルトのアドレスは (0xBA)となっています。

Arduino用のライブラリは
ボード供給元の Sparkfun では提供されていないので
https://github.com/SandboxElectronics/UART_Bridge を使いました。
githubからzipファイルをダウンロードして
Arduino IDE のライブラリに追加します。
(追加の手順は割愛します。)

ライブラリを追加したら
ファイル → スケッチの例 → UART_Bridge-master → I2CSELFTEST を開きます。

6行目の
SC16IS750 i2cuart = SC16IS750(SC16IS750_PROTOCOL_I2C,SC16IS750_ADDRESS_AD);

SC16IS750 i2cuart = SC16IS750(SC16IS750_PROTOCOL_I2C,SC16IS750_ADDRESS_BA);
に変更します。(変換ボードのアドレスを変更した場合は変更したアドレスに合わせます。)

このサンプルスケッチはループバックテストなので
TXとRXを接続してください。

シリアルモニタで確認すると

device found
start serial communication
とだけ表示されます。なんか動いていないように見えますが
このサンプルプログラムを見ると
送信したデータと違うデータを受信したときのみ
“serial communication error” と表示して
正常の場合は何も表示しないようになっています。

正常時

使ったサンプルプログラム

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
#include <Wire.h>
#include <SC16IS750.h>
#include <string.h>
#include <SPI.h>
 
SC16IS750 i2cuart = SC16IS750(SC16IS750_PROTOCOL_I2C,SC16IS750_ADDRESS_BA);
 
//Connect TX and RX with a wire and run this sketch
 
void setup() 
{
    Serial.begin(9600);
 
    // UART to Serial Bridge Initialization
    i2cuart.begin(9600);               //baudrate setting
    if (i2cuart.ping()!=1) {
        Serial.println("device not found");
        while(1);
    } else {
        Serial.println("device found");
    }
    Serial.println("start serial communication");
 
 
 
};
 
void loop() 
{
 
    i2cuart.write(0x55);
    while(i2cuart.available()==0);
    if (i2cuart.read()!=0x55) {
        Serial.println("serial communication error");
        while(1);
    }   
    delay(200);
 
    i2cuart.write(0xAA);
    while(i2cuart.available()==0);
    if (i2cuart.read()!=0xAA) {
        Serial.println("serial communication error");
        while(1);
    }   
 
    delay(200);
};

次回はシリアル出力の GPSモジュール を接続してみます。

プリント基板CAD用ライブラリ配布サイト

たまにはプリント基板CAD Eagle ネタを

勤めを辞めてからEagleを扱う機会が増えていますが
辛いのが使いたい部品のシンボルが無い時。

無精者の自分はシンボルを自分で作るのも面倒なので
ネットに公開されていないか探しまくります。

そこでちょっと便利なサイトの紹介です。
(もしかしたらかなり以前に少しだけふれていたかも)

SnapEDA というサイトです。
利用登録は必要ですが無料で使えるサイトです。

snapeda_1
[トップ画面]

検索したい部品名を入力して「虫眼鏡アイコン」をクリック(またはリターンを押す)
snapeda_2
[検索]

検索した部品が登録されていると以下のような画面になりますので、赤枠の部分をクリックします。
なお、一番右に表示されているアイコンは
左から {データシート} {回路図用シンボル] [基板用パターン] の有無を示しています。
snapeda_3
[検索結果]

検索結果をクリックすると以下のような画面になります。
今回検索した部品はシンボル図、パターン図ともに有りとなっていたので両方表示されています。
ここでCAD用データをダウンロードできます。
シンボル図とパターン図の両方が必要な場合は [Download Symbol and Footprint] ボタンを
パターン図だけが必要な場合は [Download Footprint] ボタンを押してください。
snapeda_4
[シンボル・パターン確認]

ログインしていないと以下のログインページが表示されますので
登録している場合はログインを登録していない場合は登録作業を行ってください。
snapeda_5[ログイン画面]

対象となるCADのリストが表示されますので、自分の使っているCADを選択すると変換・タウンロードが始まります。
snapeda_6[対象CADの選択]

以上でダウンロード終了となりますので、お使いのCADにダウンロードしたライブラリを登録すれば使えるようになります。
snapeda_7[ダウンロード終了]

エレキットの2chリレー付き赤外線リモコン

知人に頼まれてコスプレ衣装のLEDをリモコンでON/OFFする改造を行いました。
時間も無かったのでエレキットの2chリレー付き赤外線リモコンキットを使ったのですが

電源電圧 / DC9~13V(安定化不要)

となっているにも関わらず、リレーが12Vのため
9Vの乾電池(006P)だとすぐにリレーが動かなくなりました。

当然と言えば当然の話ですが、
これだったら動作保証電源電圧 DC12V と明記して欲しいですね。

リレーは反応しないのに基板上のモニタLEDだけがむなしく点灯していました。

リレーの仕様も調べなかった自分も悪いのですが。

 

http://www.elekit.co.jp/product/PS-3247

Mashup Awards に応募しました。

この2ヶ月くらいの間「アイドルハッカソン」で作った成果物をMashup Awards に応募しました。

小型WiFiモジュール ESP-WROOM-02(ESP8266搭載) を使って フルカラーLEDベルト(WS2812B)をパソコンからインサーネット経由でコントロールしています。

7人のアイドルの各々のイメージカラーを考慮して、ソロパートではその子のLEDが光る等、楽曲と完全にシンクロしています。

http://hacklog.jp/works/4909

ハッカソン初めて参加しました。

昨日福岡アイドルハッカソンに参加しました。
ハッカソンへの参加は初めてでしたが色々と楽しめました。

今回はアイドルとテクノロジーの融合というちょっと変わったテーマでした。

朝10時にスタートして午前中にテーマを決めて午後から制作
そして19時から、制作したものを実際にアイドルが身に着けて
ミニライブという形での発表会&審査。
ブルートゥース
午前中のテーマ収集でアイドルの子たちからの要望が多かった
光る衣装、色が変わる衣装を題材に決定。

ちなみに我々のチームは自分と
福岡での電子工作の一番目の生徒、
今回タッグを組むことになったアイドルの熱狂的ファン、
それと、一番目の生徒の知り合い。

なんとも大丈夫か?感が一番強いチーム。
ちなみにアイドルは「ヒペリカム」という平均年齢14、6歳のフレッシュなアイドル。

午後からテーマに合わせての機材選定。
ちなみにテーマは、スマホからコントロールしてLEDチューブの色を変えるのと
マイクセンサーで音を拾ってその大きさでLEDチューブの色を変えるの2つ。

用意された機材の中からLEDチューブとArduinoとマイクセンサーユニット、
それにブレッドボードや配線資材を確保。

スマホからコントロールするのに使うブルートゥースのユニットが無かったので
これは自分の手持ちのを使うことに。

LEDチューブを使うのは初めてだったので、しようを調べたりするところから始めて
Arduino用のライブラリ探しとかを経て何とかハードとソフトが完成。

ここでまだ大きな2つの問題が。
1つは駆動用の電源。
もう一つはどうやってアイドルに装着するか。

アイドルへの装着は別のチームがやっていた100円ショップからベルトとポーチを買ってきて
ポーチの中にハードユニットを入れて、ベルトで腰に巻いてもらう方法をとることに。

駆動電源はカホパーツに単三電池4本用の電池ボックスと単三電池を買いに走ることに。
心配だったの消費電力とか計算していなかったので、ステージの間電池が持つか?

発表ステージでの「ヒペリカム」の出演順は2番目、
アイドルの2人に装置を着けてもらいスタンバイ。

ステージでは1組目の発表が始まる。

ここで「聞いていないよ~」という問題発生。
発表前にステージで製作者から、挨拶+今回の制作物の内容の説明。

仕方ないので当然アドリブで対応。
「ヒペリカム」のステージが始まりました。

装置の配線はブレッドボードにジャンパーワイヤーでの繋ぎこみ、
激しいダンスの接続が外れるのが一番の心配。
案の定1人のこの配線がスタート早々外れてしまいました。

もう一人の子の方は最後まで動いていました。

とりあえず出番が終わったら、後は傍観者、アイドルのステージを楽しみました。

全チームのステージが終わって審査開始、結構時間かかっている。

先ずは、地元TV局「KBC賞」の発表、
「KBC」の方が自ら発表、一目で業界人とわかる雰囲気の人でした。
「KBC賞はエントリーNo.2 ヒペリカムです」とのアナウンス。

なんと自分たちのチームでした。

「KBC賞」は深夜の番組でヒペリカムを紹介してもらえるということでした。
今日一日がんばった「ヒペリカム」の女の子たち、良かったね。
本当に頑張ってくれたから。

ちなみに「KBC賞」は別名「チームワーク賞」
アイドルとエンジニアがいかに協力し合って作品を作っているか
制作過程からずっと見ていらっしゃったみたいです。

ある意味「優秀賞」より嬉しいかも。

なんだかんだで長い一日が終わりました。

めちゃくちゃ楽しい一日でした。

ちなみに、この「アイドルハッカソン」の模様が
福岡KBCテレビで10月25日深夜2時から放映されるらしいです。

PICプログラマーPICkit3互換機の購入先に関しまして。

ヤフオク!にて販売していました マイクロチップPICプログラマーPickit3互換品ですが
「評価の高い方から、違反品として通告がありました」
ということで出品を取りやめました。

先日「購入先を教えてください。」と問い合わせがありました。

同様にご自身でご購入をお考えの方には購入先をお教えしますので
問い合わせフォームよりお問い合わせください。
なお購入に関しましては自己責任でお願いします。

ELECROWに注文した面付けV-CUT基板 到着

ELECROWに注文していたVカット、面付け基板が先週届きました。
実際 Vカットされているか心配でしたが
ちゃんとV-カットされていました。

10枚注文で12枚届きました。
仕上がりも別に問題なさそうです。

Vカット出来るのは結構助かります。
小さいサイズの基板が多いので、かなりのコストダウンになります。

Elecrow_Vカット基板