前の10件 | -
1ピンだけで2個のLEDを別々に操作する その2 [Arduino]
マイコンの1本のI/O端子で2個のLEDを駆動:Design Ideas - EDN Japan
https://edn.itmedia.co.jp/edn/articles/0806/01/news020.html
ここを元にシミュレーションしてみた。
ツェナーダイオード使用バージョン
ダイオードを4個直列バージョン
LEDは一定以上の電圧にならないと電流が流れないのをうまく利用している。
1ピンだけで2個のLEDを別々に操作する [Arduino]
以前にATtiny202で踏切の音と光を出すのをやりました。
ただATtiny202はふつうに使えるGPIOが5つしかないのでなるべく使用するピン数を少なくしたいところ。
LEDを1ピンだけで2個別々に操作することを思いついたのでやってみました。
(多分すでに誰かやってると思うけど)(NeoPixelを使うというのもありだけど)
5VとGNDの間に抵抗を入れて真ん中で分圧し、そことGPIOのHigh、Low、Hi-Zの3ステートで、2個の極性の反対のLEDを個別に点灯。
両方点灯させたいときはダイナミック点灯で。
欠点としては、やや暗いのと、消灯時でも電流を消費することかな。
Circuit Simulator Applet
https://www.falstad.com/circuit/circuitjs.html
というのでシミュレーションしてみた。
// LED test : Blink two LEDs using only one pin
// +5V ---[470 Ohm]--+---+--|<|--+--- GPIO (H/L/Hi-Z)
// GND ---[470 Ohm]--+ +--|>|--+
#define LED_PIN 2
void setup() {
}
void loop() {
unsigned int i;
pinMode(LED_PIN, OUTPUT);
for(i=0; i<4; i++) {
digitalWrite(LED_PIN, i&1); // Blink LEDs alternately
delay(500);
}
pinMode(LED_PIN, INPUT); // Off LEDs
delay(1000);
pinMode(LED_PIN, OUTPUT);
for(i=0; i<1000; i++) {
digitalWrite(LED_PIN, i&1); // dynamic both LEDs on
delay(1);
}
pinMode(LED_PIN, INPUT); // Off LEDs
delay(1000);
}
もっといいやり方があるらしい。
マイコンの1本のI/O端子で2個のLEDを駆動:Design Ideas - EDN Japan
https://edn.itmedia.co.jp/edn/articles/0806/01/news020.html
UNO R4 ライブラリ使わずにNeoPixel を使ってみる。 [Arduino]
ライブラリ使わずに NeoPixel を使ってみる。
素直にライブラリ使えばいいじゃん、っていう話なんですけど。
83.3nsという100ナノセカンドオーダーでI/Oポートレジスタの操作ができることを利用して、NeoPixelの制御信号を作ってみました。
素直にライブラリ使えばいいじゃん、っていう話なんですけど。
83.3nsという100ナノセカンドオーダーでI/Oポートレジスタの操作ができることを利用して、NeoPixelの制御信号を作ってみました。
// UNO R4 minima NeoPixel test
inline void PH() { R_PORT1->POSR = bit(11); } // D13(UNO R4 minima P111) HIGH (83.3ns)
inline void PL() { R_PORT1->PORR = bit(11); } // D13(UNO R4 minima P111) LOW (83.3ns)
inline void T0() { PH(); PH(); PH(); PH(); PL(); PL(); PL(); PL(); PL(); PL(); PL(); PL(); }
inline void T1() { PH(); PH(); PH(); PH(); T0(); }
#define NUMPIXELS (12)
uint8_t pixels[NUMPIXELS * 3]; // GRBGRBGRB...
void setup() {
R_PORT1->PODR |= bit(11); // D13(UNO R4 minima P111) pinMode OUTPUT
}
void loop() {
for (uint8_t i = 0; i < NUMPIXELS; i++) {
for (uint8_t c = 0; c < 6; c++) {
pixels[ ((NUMPIXELS + i - c) * 3 + 2) % (NUMPIXELS * 3) ] = 31 >> c;
}
neoPixelShow();
delay(100);
}
}
void neoPixelShow() {
for(uint8_t i = 0; i < NUMPIXELS * 3; i++) {
for(uint8_t bm = 0b10000000; bm; bm >>= 1) {
noInterrupts();
if (pixels[i] & bm) T1(); else T0();
interrupts();
}
}
}
UNO R4 digitalWrite と I/Oポートレジスタ [Arduino]
UNO R4 で digitalWrite() の代わりに、I/Oポートレジスタを制御することで高速化できるということは、各所で報告されております。
digitalWriteFast with UNO R4 - UNO R4 _ UNO R4 Minima - Arduino Forum
https://forum.arduino.cc/t/digitalwritefast-with-uno-r4/1145206
digitalWrite() と I/Oポートレジスタの制御でどのくらい時間が違うのかですが、
HIGH, LOW 1000回ループと、HIGH, LOW, HIGH, LOW 1000回ループの差分でfor()ループの影響を除去してHIGH, LOW 1000回分だけとして、これを2で割って、digitalWrite() 1回分にかかる速度を調べてみました。ただ、割り込みなどがあるので、その時々で結構まちまちの値が出ました。
だいたい、
digitalWrite(LED_BUILTIN, HIGH); や
digitalWrite(LED_BUILTIN, LOW);
で 700 ns ちょっと。
R_PORT1->POSR = bit(11); や
R_PORT1->PORR = bit(11);
で 83 ns ちょっと。
UNO R4が48MHzということは、CPU 1cycleあたり、20.8333 nsくらい。
83.333nsだと、4 cyclesに相当するのかな?
ポート操作は速いけど、UNO R4は、「MINIMA」と「WIFI」でも一部ポートが違うので注意。
digitalWriteFast with UNO R4 - UNO R4 _ UNO R4 Minima - Arduino Forum
https://forum.arduino.cc/t/digitalwritefast-with-uno-r4/1145206
digitalWrite() と I/Oポートレジスタの制御でどのくらい時間が違うのかですが、
HIGH, LOW 1000回ループと、HIGH, LOW, HIGH, LOW 1000回ループの差分でfor()ループの影響を除去してHIGH, LOW 1000回分だけとして、これを2で割って、digitalWrite() 1回分にかかる速度を調べてみました。ただ、割り込みなどがあるので、その時々で結構まちまちの値が出ました。
だいたい、
digitalWrite(LED_BUILTIN, HIGH); や
digitalWrite(LED_BUILTIN, LOW);
で 700 ns ちょっと。
R_PORT1->POSR = bit(11); や
R_PORT1->PORR = bit(11);
で 83 ns ちょっと。
UNO R4が48MHzということは、CPU 1cycleあたり、20.8333 nsくらい。
83.333nsだと、4 cyclesに相当するのかな?
ポート操作は速いけど、UNO R4は、「MINIMA」と「WIFI」でも一部ポートが違うので注意。
タグ:Uno R4
ケーブルあれこれ。 [周辺機器]
10Gにしたら機器が増えてケーブルもこんがらがっているので程よい長さのもので整理してみた。
■LANケーブル
カテゴリー6Aとカテゴリー7(もどき)で迷った。
カテゴリー7(もどき)は、かえってノイズが入るらしい情報も散見。
以下の情報からカテゴリー7でも悪くはないようなので、気分を上げるためにカテゴリー7(もどき)にした。
結局、STPはダメなの? UTPでいいの? LANケーブルの専門家に聞く【イニシャルB】 - INTERNET Watch
https://internet.watch.impress.co.jp/docs/column/shimizu/1331973.html
■電話線
以前は50cmのものだったけど、装置が増えて壁から離れてしまったので、1mのものに。
爪折れしにくいタイプのものにした。(外すことよっぽどないけど)
■アンテナ線
nasneを介するため2本必要。
もともとは5C同軸ケーブル(約7.7mm)の2mほどのものがぐるぐる巻きになっていた。
屋内だし、4C同軸ケーブル(約6mm)の50cm, 1mのものに変更。
■電源ケーブル
メガネケーブルでつなぐACアダプタが多すぎで場所をとるので、だいぶ前に購入してあった便利グッズを使用。三またメガネケーブル。現在は販売されていないらしい。
ダイヤテック「めがねギドラ」
https://www.google.com/search?q=FCC3M-04
それでも足りないので電源タップを使用。
ほこりっぽいところなので、電源タップも防塵タイプのものに。
■LANケーブル
カテゴリー6Aとカテゴリー7(もどき)で迷った。
カテゴリー7(もどき)は、かえってノイズが入るらしい情報も散見。
以下の情報からカテゴリー7でも悪くはないようなので、気分を上げるためにカテゴリー7(もどき)にした。
結局、STPはダメなの? UTPでいいの? LANケーブルの専門家に聞く【イニシャルB】 - INTERNET Watch
https://internet.watch.impress.co.jp/docs/column/shimizu/1331973.html
■電話線
以前は50cmのものだったけど、装置が増えて壁から離れてしまったので、1mのものに。
爪折れしにくいタイプのものにした。(外すことよっぽどないけど)
■アンテナ線
nasneを介するため2本必要。
もともとは5C同軸ケーブル(約7.7mm)の2mほどのものがぐるぐる巻きになっていた。
屋内だし、4C同軸ケーブル(約6mm)の50cm, 1mのものに変更。
■電源ケーブル
メガネケーブルでつなぐACアダプタが多すぎで場所をとるので、だいぶ前に購入してあった便利グッズを使用。三またメガネケーブル。現在は販売されていないらしい。
ダイヤテック「めがねギドラ」
https://www.google.com/search?q=FCC3M-04
それでも足りないので電源タップを使用。
ほこりっぽいところなので、電源タップも防塵タイプのものに。
エレコム LANケーブル CAT7 0.5m ツメが折れない 爪折れ防止コネクタ スタンダード ブルーメタリック LD-TWST/BM05
- 出版社/メーカー: エレコム(ELECOM)
- 発売日: 2013/05/26
- メディア: Personal Computers
エレコム LANケーブル CAT7 1m ツメが折れない 爪折れ防止コネクタ スタンダード ブルーメタリック LD-TWST/BM10
- 出版社/メーカー: エレコム(ELECOM)
- 発売日: 2013/05/26
- メディア: Personal Computers
パナソニック(Panasonic) ザ・タップF ジャストフィット 3コ口 スナップキャップ・30cmコード付 タイプ X ホワイト WHF21033WP
- 出版社/メーカー: パナソニック(Panasonic)
- メディア: Tools & Hardware
SSA Service エスエスエーサービス テレビアンテナケーブル 1m 国産4C F型両端ストレート S4-FP-FP-1
- 出版社/メーカー: SSA Service
- メディア: エレクトロニクス
エスエスエーサービス テレビアンテナケーブル 0.5m 国産4C F型両端ストレート S4-FP-FP-0.5
- 出版社/メーカー: SSA Service
- メディア: エレクトロニクス
テレホンコード 標準タイプ ホワイト 1m_TEL-C2602W 05-2602 OHM オーム電機
- 出版社/メーカー: (株)オーム電機
- メディア:
タグ:LAN
ドコモ光 10G回線とテレビと電話と [周辺機器]
ひさりぶりの更新。
仕事が忙しくなり、やる気低下気味なので環境整備の回。
意味はないことは分かっていながら気分を上げるため、回線を1Gから10Gに変更してみました。
うちの地域はそんなに田舎ではないものの、なぜか10Gの開始が遅れていて、今年になってやっと10Gサービスが始まりました。
うちはドコモ光でまとめていて、「ドコモ光電話」、「ドコモ光テレビオプション」にも入っていたのですが、いろいろ装置が増えました。
右から
光コンセント
↓ (光ケーブル)
・SCM-PDS 光加入者終端装置 (光回線からテレビをみるための装置) → アンテナ線(nasneへ)
↓ (光ケーブル)
・10G-EPON (10G-ONU、光回線からLANへ変換)
↓ (LANケーブル)
・XG-100NE (ホームゲートウェイ) → 電話回線
↓ (LANケーブル)
・nasne → アンテナ線(テレビ用)
・Aterm WX11000T12 (ブリッジモード)
という感じ。
いままでは、ONU、テレビ、電話が一体で、Wi-Fiもセットだったのに。
(たしか、PR-600MI/GV-ONU だったような。)
ドコモ光テレビオプション(825円/月)というのは、映像配信系サービスとは違って、単純にテレビアンテナの代わりになるもの。台風でアンテナが吹っ飛ぶ心配なし。光回線開通と同時なら初期費用は抑えられる(13,530円~)。ただ長い目で見るとアンテナ設置のほうが安いとは思います。
もともとルーターはレンタル(550円/月)せずAterm WX11000T12を使用する予定(購入済)でしたが、XG-100NEは電話機能(550円/月)のために設置されてしまいました(ただし無料レンタル)。
電話が必要なければ、XG-100NEは不要でAterm WX11000T12(ルーターモード)のみでよかったっぽい。
XG-100NEにはWi-Fi機能も装置的には備わっているのですが機能を使うには別料金(西日本だと110円/月)が必要らしい。
というか、月々の別料金を払えば、ルーターを買わなくてもよかった。
(まあAtermのほうが機能は上だし、、と自分を納得させる。)
ドコモ光 10ギガ | インターネット回線・固定電話 | NTTドコモ
https://www.docomo.ne.jp/internet/hikari/10g_plan/
ドコモ光電話向けサービス | ドコモ光 | インターネット回線・固定電話 | NTTドコモ
https://www.docomo.ne.jp/internet/hikari/tell_service/service/
ドコモ光テレビオプション | ドコモ光 | インターネット回線・固定電話 | NTTドコモ
https://www.docomo.ne.jp/internet/hikari/eizo_service/tv_option/
で、10Gにして速くなったのかどうか?
→ 全く実感できず。
仕事が忙しくなり、やる気低下気味なので環境整備の回。
意味はないことは分かっていながら気分を上げるため、回線を1Gから10Gに変更してみました。
うちの地域はそんなに田舎ではないものの、なぜか10Gの開始が遅れていて、今年になってやっと10Gサービスが始まりました。
うちはドコモ光でまとめていて、「ドコモ光電話」、「ドコモ光テレビオプション」にも入っていたのですが、いろいろ装置が増えました。
右から
光コンセント
↓ (光ケーブル)
・SCM-PDS 光加入者終端装置 (光回線からテレビをみるための装置) → アンテナ線(nasneへ)
↓ (光ケーブル)
・10G-EPON (10G-ONU、光回線からLANへ変換)
↓ (LANケーブル)
・XG-100NE (ホームゲートウェイ) → 電話回線
↓ (LANケーブル)
・nasne → アンテナ線(テレビ用)
・Aterm WX11000T12 (ブリッジモード)
という感じ。
いままでは、ONU、テレビ、電話が一体で、Wi-Fiもセットだったのに。
(たしか、PR-600MI/GV-ONU だったような。)
ドコモ光テレビオプション(825円/月)というのは、映像配信系サービスとは違って、単純にテレビアンテナの代わりになるもの。台風でアンテナが吹っ飛ぶ心配なし。光回線開通と同時なら初期費用は抑えられる(13,530円~)。ただ長い目で見るとアンテナ設置のほうが安いとは思います。
もともとルーターはレンタル(550円/月)せずAterm WX11000T12を使用する予定(購入済)でしたが、XG-100NEは電話機能(550円/月)のために設置されてしまいました(ただし無料レンタル)。
電話が必要なければ、XG-100NEは不要でAterm WX11000T12(ルーターモード)のみでよかったっぽい。
XG-100NEにはWi-Fi機能も装置的には備わっているのですが機能を使うには別料金(西日本だと110円/月)が必要らしい。
というか、月々の別料金を払えば、ルーターを買わなくてもよかった。
(まあAtermのほうが機能は上だし、、と自分を納得させる。)
ドコモ光 10ギガ | インターネット回線・固定電話 | NTTドコモ
https://www.docomo.ne.jp/internet/hikari/10g_plan/
ドコモ光電話向けサービス | ドコモ光 | インターネット回線・固定電話 | NTTドコモ
https://www.docomo.ne.jp/internet/hikari/tell_service/service/
ドコモ光テレビオプション | ドコモ光 | インターネット回線・固定電話 | NTTドコモ
https://www.docomo.ne.jp/internet/hikari/eizo_service/tv_option/
で、10Gにして速くなったのかどうか?
→ 全く実感できず。
AtomS3 Liteで赤外線リモコン [Arduino]
AtomS3 Liteには赤外線LEDが付いていて、サンプルにもNECタイプのリモコンスケッチがあった。
でも、うちのテレビはソニー製。うちのソニーのテレビリモコンは電源ボタン以外は赤外線ではないものの、テレビ本体は赤外線リモコンの受信は可能。
というわけで、サンプルスケッチをいじってソニーのテレビの操作。
といってもボタンも1つしかないので単機能、ミュートのトグル。
それにしても、うちの遅いパソコンではコンパイルに時間がかかる。
調べてみると、ESP32は簡単にPWMをつくることができるようだ。
というわけでリモコン信号も簡単にできた。
ライブラリ不要となり、多少コンパイル時間も短くなり、プログラムのサイズも減った。
AtomS3 Liteの赤外線LEDが光っている様子。
でも、うちのテレビはソニー製。うちのソニーのテレビリモコンは電源ボタン以外は赤外線ではないものの、テレビ本体は赤外線リモコンの受信は可能。
というわけで、サンプルスケッチをいじってソニーのテレビの操作。
といってもボタンも1つしかないので単機能、ミュートのトグル。
// Infrared remote control (M5atomS3, SIRC version)
#define DISABLE_CODE_FOR_RECEIVER
#define SEND_PWM_BY_TIMER // use hardware PWM
#define IR_TX_PIN 4
#include "M5AtomS3.h"
#include <IRremote.hpp>
void setup() {
auto cfg = M5.config();
AtomS3.begin(cfg);
IrSender.begin(DISABLE_LED_FEEDBACK); // Start with IR_SEND_PIN as send pin
IrSender.setSendPin(IR_TX_PIN);
}
void loop() {
AtomS3.update();
if( AtomS3.BtnA.wasPressed() ) {
IrSender.sendSony( 0x01, 0x14, 3, SIRCS_12_PROTOCOL ); // SONY TV mute toggle
} // address:0x01(TV,5bits), command:0x14(mute,7bits), repeat:3times, 12bits
}
それにしても、うちの遅いパソコンではコンパイルに時間がかかる。
調べてみると、ESP32は簡単にPWMをつくることができるようだ。
というわけでリモコン信号も簡単にできた。
// Infrared remote control with 40kHz PWM (ESP32, SIRC version)
uint8_t ledIR = 4;
void setup() {
ledcSetup( 1, 40000, 8 ); // 40 kHz PWM, 8-bit resolution
ledcAttachPin( ledIR, 1 ); // assign IR LED pin to channel
pinMode( 41, INPUT_PULLUP );
}
void loop() {
while( digitalRead( 41 ) );
sendIrSIRCesp32( 0x14 | 0x01 << 7 ); // SONY mute toggle (cmd:0x14(7bit), adrs:0x01(5bit))
sendIrSIRCesp32( 0x14 | 0x01 << 7 ); // repeat 3 times
sendIrSIRCesp32( 0x14 | 0x01 << 7 );
}
void sendIrSIRCesp32( uint32_t d ) { // T = 0.60msec
uint8_t b = (d & 0xF8000) ? 20 :
(d & 0x07000) ? 15 : 12; // number of bits
uint16_t usON, usTrailer = 42000; // 70T = interval(75T) - leader(5T)
ledcWrite( 1, 85 ); delayMicroseconds( 2400 ); // leader ON (4T)
ledcWrite( 1, 0 ); delayMicroseconds( 600 ); // leader OFF (1T)
for(uint8_t i = 0; i < b; i++) { // data(command + address)
usON = ((d>>i)&1) ? 1200 : 600; // data(0:1T / 1:2T)
ledcWrite( 1, 85 ); delayMicroseconds( usON ); // data ON
ledcWrite( 1, 0 ); delayMicroseconds( 600 ); // data OFF (1T)
usTrailer -= (usON + 600); // trailer
}
delayMicroseconds( usTrailer );
}
ライブラリ不要となり、多少コンパイル時間も短くなり、プログラムのサイズも減った。
AtomS3 Liteの赤外線LEDが光っている様子。
AtomS3 Lite 買ってみた。 [Arduino]
無線(というかWi-Fi)を使ってみたくてちょっと調べてみた。
・Uno R4 WiFi でもいいんだけど、、小さいやつ希望
・type-Cで
・技適通ってるやつで
・DIPの幅狭めで
・新しめで
・情報多めのやつで
Nano ESP32 | Arduino Documentation
https://docs.arduino.cc/hardware/nano-esp32
「Arduino Nano ESP32」がtype-CでArduino純正のボードだけど、技適通ってないっぽい。
Seeed Studio XIAO ESP32S3 — スイッチサイエンス
https://www.switch-science.com/products/8968
同じESP32S3使ってる「Seeed Studio XIAO ESP32S3」もいいけど、アンテナが外付け&本体よりでかい。
ESP32-C3 か S3 かどっちがいいのかもよくわからない。
UNO R4 WiFi や nano ESP32 には S3 が載っているので、とりあえず S3 の方向で。
ほかにESP32S3で探すと、M5Stack関連が出てきた。
M5Stackというとディスプレイとかボタンとかいろいろ付いている系と思っていたけど、割とシンプルなボードもあったので購入してみた。
AtomS3 Lite
https://docs.m5stack.com/en/core/AtomS3%20Lite
AtomS3 Lite:ボタン、RGB LED、赤外線LEDが付いている。
M5StampS3 PIN2.54
https://docs.m5stack.com/en/core/M5StampS3%20PIN2.54
M5stampS3:ボタン、RGB LEDだけ。ブレッドボードで遊べるように2.54mm DIPタイプを選択。
とりあえず、AtomS3 Liteを開封
技適通ってる。
裸眼では読めない部分あり。
・Uno R4 WiFi でもいいんだけど、、小さいやつ希望
・type-Cで
・技適通ってるやつで
・DIPの幅狭めで
・新しめで
・情報多めのやつで
Nano ESP32 | Arduino Documentation
https://docs.arduino.cc/hardware/nano-esp32
「Arduino Nano ESP32」がtype-CでArduino純正のボードだけど、技適通ってないっぽい。
Seeed Studio XIAO ESP32S3 — スイッチサイエンス
https://www.switch-science.com/products/8968
同じESP32S3使ってる「Seeed Studio XIAO ESP32S3」もいいけど、アンテナが外付け&本体よりでかい。
ESP32-C3 か S3 かどっちがいいのかもよくわからない。
UNO R4 WiFi や nano ESP32 には S3 が載っているので、とりあえず S3 の方向で。
ほかにESP32S3で探すと、M5Stack関連が出てきた。
M5Stackというとディスプレイとかボタンとかいろいろ付いている系と思っていたけど、割とシンプルなボードもあったので購入してみた。
AtomS3 Lite
https://docs.m5stack.com/en/core/AtomS3%20Lite
AtomS3 Lite:ボタン、RGB LED、赤外線LEDが付いている。
M5StampS3 PIN2.54
https://docs.m5stack.com/en/core/M5StampS3%20PIN2.54
M5stampS3:ボタン、RGB LEDだけ。ブレッドボードで遊べるように2.54mm DIPタイプを選択。
とりあえず、AtomS3 Liteを開封
技適通ってる。
裸眼では読めない部分あり。
UNO R4で音楽演奏 [Arduino]
音楽演奏のスケッチをいろいろなバージョンで作ってきたけど、UNO R4でもやってみた。
・DAC(12bit)を使用
・正弦波は計算で作成
・音程も計算で作成
・レジスタ触らない
・ところどころブラッシュアップ
10kΩの可変抵抗の前に100kΩの抵抗を挟んで約10分の1に分圧したらボリュームとしてちょうどいい感じ。(理論上は40kΩかな)
楽譜の作成と定義のファイルは以前と同様。
https://hello-world.blog.ss-blog.jp/2022-07-04
・DAC(12bit)を使用
・正弦波は計算で作成
・音程も計算で作成
・レジスタ触らない
・ところどころブラッシュアップ
10kΩの可変抵抗の前に100kΩの抵抗を挟んで約10分の1に分圧したらボリュームとしてちょうどいい感じ。(理論上は40kΩかな)
楽譜の作成と定義のファイルは以前と同様。
https://hello-world.blog.ss-blog.jp/2022-07-04
// Uno R4 DAC Score Replay Sketch
#include "notes2.h" // note definition data (pitch(octave,scale) + length)
#define F_SAMP 50000 // sampling frequency (Hz) (divisor of 1,000,000 (usec))
#define MAX_TRACK 4 // Maximum tracks
static uint16_t SIN[256]; // array of sine wave
static uint16_t OCT9[12]; // array subscript difference in the 9th octave
static const uint16_t Jesus[] = { // J.S.Bach "Jesu, Joy of Man's Desiring"
125 , 0 ,
b4e , g4e , a4e , b4e , d5e , c5e , c5e , e5e , d5e , d5e , g5e , F5e , g5e , d5e , b4e , g4e , a4e , b4e ,
e4e , d5e , c5e , b4e , a4e , g4e , d4e , g4e , F4e , g4e , b4e , d5e , g5hd, 0 ,
d4q , F4e , g4q , F4e , g4q , a4e , b4q , a4e , b4q , g4e , e4q , g4e ,
a4q , F4e , g4q , e4e , a3q , c4e , b3w , 0 ,
g3qd , e3qd , c3qd , b2qd , e3qd , d3qd ,
c3qd , C3qd , d3qd , g2w , 0 , 0 };
void setup(){
uint16_t i;
analogWriteResolution(12);
for(i=0; i<256; i++) SIN[i] = 16383.9 * (1 - cos(6.283185 * i / 256)) / 2; // 14bit sine wave
for(i=0; i< 12; i++) OCT9[i] = (440 << 16) * pow(2, (i + 51) / 12.0) / F_SAMP; // A4=440
}
void loop(){
playR4( Jesus );
}
void playR4( const uint16_t *score ){
uint8_t Tracks = 0; // track count
uint16_t note; // note (pitch(octave,scale) + length)
uint16_t NoteCycle, n; // reference note (96th note) cycle and its counter (n)
uint16_t p[MAX_TRACK]; // pointer for each track
uint8_t len[MAX_TRACK]; // note length (how many 96th notes)
uint16_t s[MAX_TRACK] = {0}; // waveform subscript (s) (x256)
uint16_t ds[MAX_TRACK] = {0}; // and its difference (ds) (x256)
uint16_t env[MAX_TRACK]; // sound envelope
uint16_t atn = 0, Atn; // attenuation counter and initial value
// *** Preparing Scores ***
Atn = 150 * F_SAMP / 1000 / 356; // attenuation half-life : 150 msec
NoteCycle = F_SAMP *4*60 / score[0] / MIN_NOTE; // reference note(96th note) cycles
for( uint16_t i = 1; Tracks < MAX_TRACK; ) { // Get track count and starting location
if( score[i++] != 0 ) continue; // Skip until 0 comes
if( score[i] == 0 ) break; // If two 0s follow, end of data
len[ Tracks ] = 1; // note length subtraction counter to 1
p[ Tracks++ ] = i; // Get location in memory, Count up the tracks
}
// *** Playback ***
n = Tracks; // To play immediately after the loop starts
uint32_t usInt = 1000000 / F_SAMP; // sampling time interval(usec)
uint32_t usPre = micros(); // sampling time previous value(usec)
do {
if( --n < Tracks ) { // Processing of score for each reference note length
if( !--len[n] ) {
note = score[ p[n]++ ];
len[n] = note & 0x00ff; // The lower 8 bits are note length (Multiples of 96th notes)
if( note & 0xff00 ) { // If not a rest... (Leave a lingering sound even with rests)
ds[n] = OCT9[ (note>>8) & 0x0f ] >> (9 - (note>>12)); // increment subscript (x256)
s[n] = 0; // start of waveform cycle
env[n] = 0xffff; // the maximum amplitude initially
}
}
if( !n ) n = NoteCycle;
}
switch( Tracks ) { // Change output by number of tracks
case 1: analogWrite( DAC, ( SIN[ (s[0]+=ds[0])>>8 ] * env[0] ) >> 18 ); // 14x16=30bit >> 18 = 12bit
break;
case 2: analogWrite( DAC, ( SIN[ (s[0]+=ds[0])>>8 ] * env[0]
+ SIN[ (s[1]+=ds[1])>>8 ] * env[1] ) >> 19 ); // 30/30(31bit)
break;
case 3: analogWrite( DAC, ( SIN[ (s[0]+=ds[0])>>8 ] * env[0]
+ SIN[ (s[1]+=ds[1])>>8 ] * env[1]
+ SIN[ (s[2]+=ds[2])>>8 ] * env[2] ) >> 20 ); // 30/30/30(31.5bit)
break;
case 4: analogWrite( DAC, ( SIN[ (s[0]+=ds[0])>>8 ] * env[0]
+ SIN[ (s[1]+=ds[1])>>8 ] * env[1]
+ SIN[ (s[2]+=ds[2])>>8 ] * env[2]
+ SIN[ (s[3]+=ds[3])>>8 ] * env[3] ) >> 20 ); // 30/30/30/30(32bit)
}
if( !atn-- ) atn = Atn; // subtract attenuation counter
if( atn < Tracks ) env[atn] -= (env[atn]>>9); // amplitude attenuation
while( micros() - usPre < usInt ); // wait for next cycle
usPre += usInt;
} while( note ); // Exit if note data is 0
analogWrite( DAC, 0 ); // Set output to 0
}
オーディオアンプモジュール いろいろ [Arduino]
オーディオアンプモジュールを3種類購入してみた。
LM358というのを使ったモジュール。
使い方がわからなかった。
HAA2018というを使ったモジュール。(販売元の説明ではXS9871であった。)
muteがHIGHのときミュートになるらしいが、デフォルトではGNDにつながっていないのに音が出た。muteに5Vかけたらミュートになった。
UNO R4のA0のDACからの電圧を可変抵抗でだいぶ落とさないと音が割れた。
XPT8871というを使ったモジュール。(販売元の写真ではLTK5128のやつもあった。)
こっちはmuteをGNDに落とさないと音が出なかった。
これも可変抵抗で電圧を落として入力。
裏面に各ピンの説明がシルク印刷されていて、普通のヘッダーピンだと見えなくなるので、L字のものを使ってみた。
ちょっと調べてみると、ライン入力は1Vっぽいので、5VのUNO R4の場合、可変抵抗に入力する前に、その4倍以上の抵抗を挟まないといけなさそう。
前の10件 | -