LiquidCrystal164
2022-05-23
前の記事
LiquidCrystalSerial / LiquidCrystal_74HC595
ではArduinoにシリアルでLCDを接続するのに 74HC595 を使っていたけど同じシフトレジスタ 74HC164 でできないかと探したらありました。
まりす氏の記事
ArduinoにLCDを信号線3本で繋ぐ
感謝!
あると思っていた74HC595が見当たらず74HC164が出てきたのでライブラリを探していました。
LiquidCrystalSerial / LiquidCrystal_74HC595
ではArduinoにシリアルでLCDを接続するのに 74HC595 を使っていたけど同じシフトレジスタ 74HC164 でできないかと探したらありました。
まりす氏の記事
ArduinoにLCDを信号線3本で繋ぐ
感謝!
あると思っていた74HC595が見当たらず74HC164が出てきたのでライブラリを探していました。
ADS1015を使った電圧計の試作(3)正負入力
2022-05-22
前の記事では正電圧しか測れない。負電圧も測れるようしたいですね。
ヒントがこちらにありました。
Adafruit_ADS1X15.cpp
130行から差動入力について書いてあります。
これを使えばいいようです。
readADC_Differential_0_1() a0とa1の差動入力
readADC_Differential_0_3() a0とa3 〃
readADC_Differential_1_3() a1とa3 〃
readADC_Differential_2_3() a2とa3 〃
a3を仮想グランドにすれば 3チャンネルの電圧計になるのでは?。
とりあえずの回路
(クリックで拡大)
VCCを分圧してa3に繋ぎ仮想グランドとします。
点線左は実験時の接続、二つの手持ちの電源とVCCを半固定抵抗で分圧したものをつないでます。
実験の様子
(クリックで拡大)
シリアルプロッタ出力
(クリックで拡大)
AIN0がバタついてるのはVCCを抵抗分圧しただけのためでしょう、一応パスコンは入れているんですが。
AIN1には1V、AIN2には-0.5Vをそれぞれ自作電源から入れたので安定しています。
このままだとテスターのように使うには入力保護がないし、レンジ切り替えもないのが問題。
何かに組み込んで使うとなると仮想GNDがネックとなる、これは別回路を検討中。
スケッチです、LCDは使っていません、いずれ使えるようにします。
ヒントがこちらにありました。
Adafruit_ADS1X15.cpp
130行から差動入力について書いてあります。
これを使えばいいようです。
readADC_Differential_0_1() a0とa1の差動入力
readADC_Differential_0_3() a0とa3 〃
readADC_Differential_1_3() a1とa3 〃
readADC_Differential_2_3() a2とa3 〃
a3を仮想グランドにすれば 3チャンネルの電圧計になるのでは?。
とりあえずの回路
(クリックで拡大)
VCCを分圧してa3に繋ぎ仮想グランドとします。
点線左は実験時の接続、二つの手持ちの電源とVCCを半固定抵抗で分圧したものをつないでます。
実験の様子
(クリックで拡大)
シリアルプロッタ出力
(クリックで拡大)
AIN0がバタついてるのはVCCを抵抗分圧しただけのためでしょう、一応パスコンは入れているんですが。
AIN1には1V、AIN2には-0.5Vをそれぞれ自作電源から入れたので安定しています。
このままだとテスターのように使うには入力保護がないし、レンジ切り替えもないのが問題。
何かに組み込んで使うとなると仮想GNDがネックとなる、これは別回路を検討中。
スケッチです、LCDは使っていません、いずれ使えるようにします。
// ADS1015電圧計の試作
// 正負入力
// 2022/05/19 edy
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1015 ads;
// https://github.com/adafruit/Adafruit_ADS1X15/tree/master/examples/differential
//
// ADS1015 ADS1115
// ------- -------
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
// https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c
//
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 8, 2); // TRULY M161-1A1 見た目は16桁1行だが実際は8桁2行
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");
ads.begin();
lcd.init();
lcd.clear();
ads.setGain(GAIN_TWO);
}
void loop(void)
{
int16_t AIN0, AIN1, AIN2;
char s[8];
AIN0 = ads.readADC_Differential_0_3();
AIN1 = ads.readADC_Differential_1_3();
AIN2 = ads.readADC_Differential_2_3();
Serial.print("AIN0="); Serial.print(AIN0);
Serial.print(" AIN1="); Serial.print(AIN1);
Serial.print(" AIN2="); Serial.println(AIN2);
// dtostrf(AIN0, 5, 0, s);
// lcd.setCursor(0, 0);
// lcd.print(s);
//
// dtostrf(AIN1, 5, 0, s);
// lcd.setCursor(5, 0);
// lcd.print(s);
//
// dtostrf(AIN2, 5, 0, s);
// lcd.setCursor(10, 0);
// lcd.print(s);
//
delay(1000);
//
}
ADS1015を使った電圧計の試作(2)
2022-05-17
2チャンネル表示にしてみました。
実際には同じ電圧を測っているのですが、右側はゲインを2倍にしてあります。
(クリックで拡大)
ADS1015のゲイン設定はこちらを参考にしました。
Adafruit_ADS1X15/examples/singleended/singleended.ino
左側は setGain(GAIN_TWO);
右側は setGain(GAIN_FOUR);
実際には誤差があったのでスケッチで補正してあります。
これは電子負荷の表示用に使う予定です。ですので両方とも単位はmVですが、片方はmAになる予定です。
とりあえずのスケッチ。
実際には同じ電圧を測っているのですが、右側はゲインを2倍にしてあります。
(クリックで拡大)
ADS1015のゲイン設定はこちらを参考にしました。
Adafruit_ADS1X15/examples/singleended/singleended.ino
左側は setGain(GAIN_TWO);
右側は setGain(GAIN_FOUR);
実際には誤差があったのでスケッチで補正してあります。
これは電子負荷の表示用に使う予定です。ですので両方とも単位はmVですが、片方はmAになる予定です。
とりあえずのスケッチ。
// ADS1015電圧計の試作
// 2022/05/17 edy
#include <Wire.h>
#include <Adafruit_ADS1X15.h>
Adafruit_ADS1015 ads;
// https://github.com/adafruit/Adafruit_ADS1X15/blob/master/examples/singleended/singleended.ino
//
// ADS1015 ADS1115
// ------- -------
// ads.setGain(GAIN_TWOTHIRDS); // 2/3x gain +/- 6.144V 1 bit = 3mV 0.1875mV (default)
// ads.setGain(GAIN_ONE); // 1x gain +/- 4.096V 1 bit = 2mV 0.125mV
// ads.setGain(GAIN_TWO); // 2x gain +/- 2.048V 1 bit = 1mV 0.0625mV
// ads.setGain(GAIN_FOUR); // 4x gain +/- 1.024V 1 bit = 0.5mV 0.03125mV
// ads.setGain(GAIN_EIGHT); // 8x gain +/- 0.512V 1 bit = 0.25mV 0.015625mV
// ads.setGain(GAIN_SIXTEEN); // 16x gain +/- 0.256V 1 bit = 0.125mV 0.0078125mV
// https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c
//
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 8, 2); // TRULY M161-1A1 見た目は16桁1行だが実際は8桁2行
void setup(void)
{
Serial.begin(9600);
Serial.println("Hello!");
ads.begin();
lcd.init();
lcd.clear();
}
void loop(void)
{
int16_t adc0, adc1;
char s[8];
ads.setGain(GAIN_TWO);
adc0 = ads.readADC_SingleEnded(0);
adc0 += ads.readADC_SingleEnded(0);
adc0 /= 2;
Serial.print("AIN0: "); Serial.println(adc0);
dtostrf(adc0 + adc0 / 998, 5, 0, s); //補正
lcd.setCursor(0, 0);
lcd.print(s); lcd.print("mV");
ads.setGain(GAIN_FOUR);
adc1 = ads.readADC_SingleEnded(1);
adc1 += ads.readADC_SingleEnded(1);
adc1 /= 2;
Serial.print("AIN1: "); Serial.println(adc1);
dtostrf(adc1 + adc1 / 665, 5, 0, s); //補正
lcd.setCursor(0, 1);
lcd.print(s); lcd.print("mV");
delay(1000);
}
LiquidCrystalSerial / LiquidCrystal_74HC595
2022-05-15
Arduinoに I2C でLCDを接続できるのなら、シリアルでも接続できるだろうと探したらありました。
LiquidCrystalSerial
LiquidCrystal_74HC595
どちらもシフトレジスタ 74HC595 を使っています。
I2C接続より線が一本多く必要ですが。
このブログを覗きに来るような人のパーツボックスには74HC595は数個はあるでしょう。
LiquidCrystalSerial
LiquidCrystal_74HC595
どちらもシフトレジスタ 74HC595 を使っています。
I2C接続より線が一本多く必要ですが。
このブログを覗きに来るような人のパーツボックスには74HC595は数個はあるでしょう。
ADS1015を使った電圧計の試作 Arduino Pro mini TRULY M161-1A1
2022-05-14
GY-ADS1015 ADCモジュールを使った電圧計の試作です。
Arduino Pro mini (8MHz) と以前デジットで買ったLCD (TRULY M161-1A1)を使います。
ブレッドボードで実験と思ったら問題発生、ADCモジュールとは I2C でつなぐのですがArduino Pro mini の SDA/SCL(A4/A5)が写真のように変則的な位置にあります。ボードを小さくするためでしょうか。
(クリックで拡大)
仕方ないのでジャンパーワイヤを切ってはんだ付けしました。
(クリックで拡大)
テストのためのスケッチはAdafruitのサイトを参考にしました。
Adafruitのモジュールとの違いはGY-ADS1015 はADDRピンが 10KΩでプルダウンされているので無接続でI2Cアドレスが0X48になります。
ADCの動作が確認できたのでLCDをつなぎました。
使ったのは以前デジットで買ったTRULY M161-1A1です。一見16桁1行表示のLCDに見えますが、内部的には8桁2行になっているという変態LCDです。当初それが分からず苦労させられました。
ArduinoとはI2C シリアル·インターフェイスモジュールを介して繋ぎました。アマゾンでは売り切れのようですが同様なものは他から入手できると思います。
I/OエキスパンダPCF8574が使われています。
(クリックで拡大)
このモジュールは以前調べて記事にしたことがあります。回路図も載せていますので必要ならば作れますが、間違いがないことは保証できませんので念のため。
使うためにはLiquidCrystal I2Cライブラリが必要です。
どうにか表示までこぎつけました。2チャンネル表示にしたいのですが、とりあえずはここまで。
(クリックで拡大)
Arduino Pro mini (8MHz) と以前デジットで買ったLCD (TRULY M161-1A1)を使います。
ブレッドボードで実験と思ったら問題発生、ADCモジュールとは I2C でつなぐのですがArduino Pro mini の SDA/SCL(A4/A5)が写真のように変則的な位置にあります。ボードを小さくするためでしょうか。
(クリックで拡大)
仕方ないのでジャンパーワイヤを切ってはんだ付けしました。
(クリックで拡大)
テストのためのスケッチはAdafruitのサイトを参考にしました。
Adafruitのモジュールとの違いはGY-ADS1015 はADDRピンが 10KΩでプルダウンされているので無接続でI2Cアドレスが0X48になります。
ADCの動作が確認できたのでLCDをつなぎました。
使ったのは以前デジットで買ったTRULY M161-1A1です。一見16桁1行表示のLCDに見えますが、内部的には8桁2行になっているという変態LCDです。当初それが分からず苦労させられました。
ArduinoとはI2C シリアル·インターフェイスモジュールを介して繋ぎました。アマゾンでは売り切れのようですが同様なものは他から入手できると思います。
I/OエキスパンダPCF8574が使われています。
(クリックで拡大)
このモジュールは以前調べて記事にしたことがあります。回路図も載せていますので必要ならば作れますが、間違いがないことは保証できませんので念のため。
使うためにはLiquidCrystal I2Cライブラリが必要です。
どうにか表示までこぎつけました。2チャンネル表示にしたいのですが、とりあえずはここまで。
(クリックで拡大)
温度湿度計の比較
2020-10-30
手持ちの温度湿度計や ENV ユニット、EnV II Hat などを並べて比較してみました。
(クリックで拡大)
左上から時計回りに
A: アマゾンで買った温度湿度計。センサは不明ですがスイス製とのことですのでおそらくセンシリオンのSHT30/31あたりでしょう。
B: ENV ユニット+M5Stack、古いタイプで今はver2になってます。センサは DHT12/BMP280/BMM150
C: 自作の温度湿度気圧計。センサは BME280
D: ENV II Hat+M5StickC。センサは SHT30/BMP280/BMM150
気圧はほぼ同じ、センサは BMP280/BME280 と違いますが、どぢらもボッシュ社製ですので合うのは当たり前でしょうか。
湿度は ENV ユニットが低めに出てしまってます。
温度は ENV II Hat が高めに出てます、ケーブル繋いで充電するとさらに高くなります。
M5StickCの発熱が伝わってるためかと思います。
ジャンパーワイヤーで離してやると影響が小さくなります。
これは以前に ENV Hat を試した時と同じです。
ENV Hat/ENV II Hat 共に直刺しすると温度が高めに出てしまうのはいささか問題です。
ジャンパーワイヤーで離すぐらいなら ENV II ユニットを使った方がいいと私は思います。
(クリックで拡大)
左上から時計回りに
A: アマゾンで買った温度湿度計。センサは不明ですがスイス製とのことですのでおそらくセンシリオンのSHT30/31あたりでしょう。
B: ENV ユニット+M5Stack、古いタイプで今はver2になってます。センサは DHT12/BMP280/BMM150
C: 自作の温度湿度気圧計。センサは BME280
D: ENV II Hat+M5StickC。センサは SHT30/BMP280/BMM150
気圧はほぼ同じ、センサは BMP280/BME280 と違いますが、どぢらもボッシュ社製ですので合うのは当たり前でしょうか。
湿度は ENV ユニットが低めに出てしまってます。
温度は ENV II Hat が高めに出てます、ケーブル繋いで充電するとさらに高くなります。
M5StickCの発熱が伝わってるためかと思います。
ジャンパーワイヤーで離してやると影響が小さくなります。
これは以前に ENV Hat を試した時と同じです。
ENV Hat/ENV II Hat 共に直刺しすると温度が高めに出てしまうのはいささか問題です。
ジャンパーワイヤーで離すぐらいなら ENV II ユニットを使った方がいいと私は思います。
Bouncing LED
2020-09-02
KenKenMkIISRさんのBouncing LED
本家の動画を見てもらった方が早いです。
手持ちのLEDテープで試してみました、LED数は50個です。arduino NANOを使ってます。
LED数や反発係数など様々なパラメータを変えることができ、とても面白いです。
もっと長いLEDテープで試してみたいのですが、暑すぎてへばってしまい、なかなかできません。
本家の動画を見てもらった方が早いです。
手持ちのLEDテープで試してみました、LED数は50個です。arduino NANOを使ってます。
LED数や反発係数など様々なパラメータを変えることができ、とても面白いです。
もっと長いLEDテープで試してみたいのですが、暑すぎてへばってしまい、なかなかできません。
久々のArduinoなのにOld Bootloader??
2018-05-06
交流電圧計の測定に使っている発振器がどうにも不安定です。
昔々に格安で手に入れた発振モジュールを使っているのですが、一番データの欲しい数100KHzあたりが不安定。
ここ数日あれこれと手を入れてかなり改善はされましたが、それよりも周波数を読むのに別に周波数カウンタが必要で、これが面倒と言うか実験中机の上がごちゃごちゃになるのです。
そこで以前実験したままで放置していた(毎度のことですが^^;;)AD9833を使ったDDSオシレーターを引っ張り出してきました。
Arduino NANO互換機で制御してます。
ちなみに写真右上のピンクのはパナソニックのモバイルバッテリーです。数年前アマゾンで購入、他の色もあったのですが、買った時点ではこれが一番安かった。
Arduino NANO互換機をブレッドボードからユニバーサル基板に乗せ換え、Arduino IDEを1.8.5にバージョンアップし、昔のスケッチを書き込もうとしたのですが、書き込めません。
いつの間にやらツールメニューにATmega328P(Old Bootloader)という選択肢が追加されてました。
これを選ぶと書き込みができました。
でもどう違うんでしょうか?
スケッチにまずいところがあり、使い勝手がイマイチなのでこれから改造です。
出力は100mVrmsですのでアンプも入れたいところです。
ついでに今度こそちゃんとしたケースに入れようと思ってます。
昔々に格安で手に入れた発振モジュールを使っているのですが、一番データの欲しい数100KHzあたりが不安定。
ここ数日あれこれと手を入れてかなり改善はされましたが、それよりも周波数を読むのに別に周波数カウンタが必要で、これが面倒と言うか実験中机の上がごちゃごちゃになるのです。
そこで以前実験したままで放置していた(毎度のことですが^^;;)AD9833を使ったDDSオシレーターを引っ張り出してきました。
Arduino NANO互換機で制御してます。
ちなみに写真右上のピンクのはパナソニックのモバイルバッテリーです。数年前アマゾンで購入、他の色もあったのですが、買った時点ではこれが一番安かった。
Arduino NANO互換機をブレッドボードからユニバーサル基板に乗せ換え、Arduino IDEを1.8.5にバージョンアップし、昔のスケッチを書き込もうとしたのですが、書き込めません。
いつの間にやらツールメニューにATmega328P(Old Bootloader)という選択肢が追加されてました。
これを選ぶと書き込みができました。
でもどう違うんでしょうか?
スケッチにまずいところがあり、使い勝手がイマイチなのでこれから改造です。
出力は100mVrmsですのでアンプも入れたいところです。
ついでに今度こそちゃんとしたケースに入れようと思ってます。
Arduino 互換ボード SS MICROを試す
2017-07-22
Aliからatmega32U4を使った互換ボードを二つ購入しました。
USBポートに直接させる形状です。3.3Vのレギュレーターも載っています。
一つずつ袋に入っているので、取りあえず一つだけ開けてあれこれいじっていたのですが、どういうわけか途中から使えなくなりました。USBデバイスとして認識してくれません。何をやったか覚えていません。
仕方がないのでもう一つ使いましたが、そちらは今のところ正常です。
右側が動作不良品。
気になるのは同じatmega32U4を使ったArduino Leonardo等はUSBポート・atmega32U4間に22オームの抵抗が入ってるのですが、この互換ボードにはありません。それがトラブルの原因かどうかは不明ですが。
Arduino Leonardoの回路図
USBポートに直接させる形状です。3.3Vのレギュレーターも載っています。
一つずつ袋に入っているので、取りあえず一つだけ開けてあれこれいじっていたのですが、どういうわけか途中から使えなくなりました。USBデバイスとして認識してくれません。何をやったか覚えていません。
仕方がないのでもう一つ使いましたが、そちらは今のところ正常です。
右側が動作不良品。
気になるのは同じatmega32U4を使ったArduino Leonardo等はUSBポート・atmega32U4間に22オームの抵抗が入ってるのですが、この互換ボードにはありません。それがトラブルの原因かどうかは不明ですが。
Arduino Leonardoの回路図
Arduino Pro Microを試す。(3)HIDとして使う(2)
2017-06-15
前の記事では会社のバーコードスキャナーにスイッチを付けてというか乗せてTabコードを出すことを考えましたが、Shift-Tabも出せたほうが便利だと思います。Tabで次のフィールドに移動、Shift-Tabで前のフィールドに移動します。さらに後で何かの機能を追加するかもしれないので、結局スイッチを三個つけることにしました。
バーコードスキャナーの上に何らかの方法でスイッチを乗せ、本体側とケーブルでつなぎます。単純に考えると配線が四本必要になりますが、これを二本でやりたいわけです、シールド線を使うことになりますが。
Arduinoのアナログ入力を使い、抵抗による分圧によって電圧を変えます、スイッチごとに違う電圧が出ればいいわけです。
本体とは1.5メートルほどあります、念のため断線や短絡があればそれも検出できればいいでしょう、ただ道具が無い会社では修理は無理ですけど。(勤め先はスーパーマーケットですので)
一応回路図です。点線から右側がスイッチ部です。
アナログ入力 A0 を使いました。
VCC=5Vとして、断線ならA0の電圧は5Vになりますが、
スイッチが何も押されていない時 4V
SW1 オンの時 3V
SW2 オンの時 2V
SW3 オンの時 1V
となるように抵抗値を計算しました。当然短絡時は0Vです。
実験の様子、R1は手持ちにあった金属皮膜の1%を使いましたが、他は5%のカーボンです。
スイッチはもっと増やせますが、そうすると1%が必要になるでしょう、今回はこれで十分です。
スイッチの状態はAD変換値をADCresultとして
SW=(ADCresult+102)/205
で計算できます、102≒1023/10、205≒1023/5です。
SW=
5 断線
4 スイッチオールオフ
3 SW1 オン
2 SW2 オン
1 SW3 オン
0 短絡
です。
スケッチはこちら
とりあえずのスケッチですので断線・短絡時には何もしていません、LEDを点滅させるかブザーを鳴らすなどすればいいと思ってます。
スケッチ内にdelay()を多用してますが、delay時間が適当かどうかも十分検討はしていません。
SW1 にTab、SW2にShift-Tabを割り当て、表計算ソフトでアクティブセルが移動するのが確認できました。
なお、抵抗分割によるスイッチ入力にはしなぷすさんの抵抗分圧器を使った、多くのスイッチのセンシングという記事がありました。
私のやり方ではスイッチを同時押しすると値は変なことになりますが、しなぷすさんの方法だとスイッチに優先度があるので優れています。
バーコードスキャナーの上に何らかの方法でスイッチを乗せ、本体側とケーブルでつなぎます。単純に考えると配線が四本必要になりますが、これを二本でやりたいわけです、シールド線を使うことになりますが。
Arduinoのアナログ入力を使い、抵抗による分圧によって電圧を変えます、スイッチごとに違う電圧が出ればいいわけです。
本体とは1.5メートルほどあります、念のため断線や短絡があればそれも検出できればいいでしょう、ただ道具が無い会社では修理は無理ですけど。(勤め先はスーパーマーケットですので)
一応回路図です。点線から右側がスイッチ部です。
アナログ入力 A0 を使いました。
VCC=5Vとして、断線ならA0の電圧は5Vになりますが、
スイッチが何も押されていない時 4V
SW1 オンの時 3V
SW2 オンの時 2V
SW3 オンの時 1V
となるように抵抗値を計算しました。当然短絡時は0Vです。
実験の様子、R1は手持ちにあった金属皮膜の1%を使いましたが、他は5%のカーボンです。
スイッチはもっと増やせますが、そうすると1%が必要になるでしょう、今回はこれで十分です。
スイッチの状態はAD変換値をADCresultとして
SW=(ADCresult+102)/205
で計算できます、102≒1023/10、205≒1023/5です。
SW=
5 断線
4 スイッチオールオフ
3 SW1 オン
2 SW2 オン
1 SW3 オン
0 短絡
です。
スケッチはこちら
とりあえずのスケッチですので断線・短絡時には何もしていません、LEDを点滅させるかブザーを鳴らすなどすればいいと思ってます。
スケッチ内にdelay()を多用してますが、delay時間が適当かどうかも十分検討はしていません。
SW1 にTab、SW2にShift-Tabを割り当て、表計算ソフトでアクティブセルが移動するのが確認できました。
なお、抵抗分割によるスイッチ入力にはしなぷすさんの抵抗分圧器を使った、多くのスイッチのセンシングという記事がありました。
私のやり方ではスイッチを同時押しすると値は変なことになりますが、しなぷすさんの方法だとスイッチに優先度があるので優れています。