電子趣味の部屋

電子系のガジェットやアプリ開発等の趣味の話題を書いてます

ダイソーの300円スピーカーで遊んでみました 高音質化改造

ダイソーで販売されている300円のスピーカーで遊んでみました。

ノーマル状態では値段なりの音です。
低音が弱く、高音も細かい音が表現しきれずに軽い感じの音でした。
パワーが足りずに振動版を上手く振動しきれていないような感じです。

そこで、ネット上で何人かの方が紹介されているコンデンサの交換を試してみることにしました。

上の画像のC3とC4のチップコンデンサを交換します。
初期のコンデンサは0.082uFのものらしいのですが、これを2.2uFに交換します。
あまり容量を増やしすぎてもオペアンプが熱を持って危険なので、3.3uF以下に抑えた方が良いらしいです。
経験上、普通のサイズの電解コンデンサだと半田付けした後に基板からはがしてしまいそうで、チップコンデンサにしました。サイズは0603のもので大丈夫でした。


こんな感じです。

決して良い音ではないですが、軽い感じの違和感がある音ではなく、普通に落ち着いて聞けるような音になりました。
ちょうどPC-9801で使用している、上海問屋かあきばおーで2,000~3,000円で買った(記憶が定かではない)ミニスピーカと同レベルの音になりました。

手間はかかりましたが、300円のスピーカとAliexpressで100個200円程度のコンデンサで2,3千円の音になったと思えばよかったと思います。
もう1つ買ったので、そのうち汎用アンプ基板でオペアンプを色々変えて遊んでみたいと思います。

音源作りに持っておきたい本 サウンドプログラミング入門

スイッチサイエンスで買い物をした時についでにM5Stack ATOM Echoも買ったので、久しぶりにPSG音源でも作って遊ぼうかなと思ってます。
過去にArduinoやmbedでPSG音源やファミコン音源を作って遊んでたことがありました。
その頃に結局実現する前に飽きて止まってしまってますがFM音源を作ってみたいなと思い、仕組みを理解するために買って今でも音源関係で役に立っている本があります。

サウンドプログラミング入門 - 音響合成の基本とC言語による実装

初版は2013年3月10日発行ですが、現在でも現行商品として販売されています。

章の構成を見てもらえればわかると思いますが、波形を出力する基本からPSG音源やFM音源等の仕組みも解説されていて1冊で一通りのことがコンパクトに書かれています。
この手の本は他になかなか無いので、重宝しています。

章の構成

第1章 サウンドプログラミングの基礎知識
 1.1 サンプリング
 1.2 標本化
 1.3 量子化
 1.4 メディアの規格
 1.5 WAVEファイル
 1.6 C言語によるサウンドプログラミング
 コラム1 サウンドレコーダー

第2章 サイン波を鳴らしてみよう
 2.1 サイン波
 2.2 波形と周波数特性
 2.3 12平均律音階
 コラム2 フェード処理

第3章 サイン波を重ね合わせてみよう
 3.1 サイン波の重ね合わせ
 3.2 ノコギリ波
 3.3 矩形波
 3.4 三角波
 3.5 位相
 3.6 白色雑音
 コラム3 音の三要素

第4章 周波数特性を分析してみよう
 4.1 周波数分析
 4.2 フーリエ変換
 4.3 窓関数
 4.4 楽器音の周波数分析
 4.5 スペクトログラム
 4.6 高速フーリエ変換
 コラム4 バーチャルピッチ

第5章 加算合成 ~ 足し算で音を作ってみよう
 5.1 加算合成
 5.2 サイン波の重ね合わせ
 5.3 時間エンベロープ
 5.4 オルガン
 5.5 ピアノ
 コラム5 分析合成

第6章 周波数特性を加工してみよう
 6.1 フィルタ
 6.2 FIRフィルタ
 6.3 IIRフィルタ
 6.4 DFTフィルタ
 コラム6 インパルス応答

第7章 減算合成 ~ 引き算で音を作ってみよう
 7.1 減算合成
 7.2 原音のフィルタリング
 7.3 周波数エンベロープ
 7.4 音声合成
 7.5 ボコーダ
 コラム7 パルス列

第8章 PSG音源 ~ 電子音を鳴らしてみよう
 8.1 PSG音源
 8.2 時間エンベロープ
 8.3 ゲームミュージック
 8.4 効果音
 8.5 オーバーサンプリング
 コラム8 MMLとMIDI

第9章 アナログシンセサイザ ~ 楽器音を鳴らしてみよう
 9.1 アナログシンセサイザ
 9.2 LFO
 9.3 トレモロ
 9.4 ビブラート
 9.5 ワウ
 9.6 ADSR
 9.7 オルガン
 9.8 バイオリン
 9.9 ピアノ
 9.10 ドラム
 9.11 アナログ信号とディジタル信号
 コラム9 デチューン

第10章 FM音源 ~ 金属音を鳴らしてみよう
 10.1 FM音源
 10.2 変調指数
 10.3 周波数比
 10.4 時間エンベロープ
 10.5 チューブラーベル
 10.6 エレクトリックピアノ
 10.7 ディジタルシンセサイザ
 コラム10 モジュレーション

第11章 PCM音源 ~ サンプリングした音を鳴らしてみよう
 11.1 PCM音源
 11.2 タイムストレッチ
 11.3 ピッチシフト
 11.4 Log-PCM
 11.5 DPCM
 11.6 ADPCM
 コラム11 ループシーケンサ

第12章 リアルタイム処理のサウンドプログラミング
 12.1 サウンドデバイスとサウンドドライバ
 12.2 録音処理
 12.3 再生処理
 12.4 ループバック再生
 12.5 ボイスチェンジャ
 コラム12 Pure DataとSuperCollider

Sipeed Maix Amigo のメモ

Sipeed Maix Amigo を買ったので、初めに用意したものをメモとして残しておきます。

MaixPyドキュメント

https://wiki.sipeed.com/soft/maixpy/en/

ファームウェア

https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master

2021年6月25日の最新
https://dl.sipeed.com/shareURL/MAIX/MaixPy/release/master/maixpy_v0.6.2_54_g897214100
maixpy_v0.6.2_54_g897214100_amigo_ips_defaults.bin

スイッチサイエンスで2021年6月21日に購入したバージョンはIPSの方だった。
説明にはTFTと書いてあったので、最初にTFTの方を入れたら色が反転したりラインがズレたりした。
IPSとTFTが混在している可能性がある。

kflash_gui

https://github.com/sipeed/kflash_gui
ファームウェアを書き込むもの。
ファームウェアを書き換える場合はEraseが必要 。(デフォルトはサイズが1MBだが上手く消されないので、16MBに変更する。)

モデル

https://dl.sipeed.com/MAIX/MaixPy/model

実行するときに別途モデルが必要な時がある。
何が必要かはドキュメントを参照する。

サンプルスクリプト

https://github.com/sipeed/MaixPy_scripts

MaixPy IDE

https://dl.sipeed.com/shareURL/MAIX/MaixPy/ide

最終更新が2020年7月とバージョンが古く、ボードの選択でAMIGOがない。
選択しなくても使えるが、詳細は不明

Thonny(https://thonny.org/)でもMicroPython(generic)で使用可能
フラッシュにソースを保存するときにエラーメッセージが表示されるが、問題なく保存して実行される。
サブディレクトリは作成不可

Arduino UNO互換機を購入する際の注意事項


Arduino UNOを購入する際に価格が安い互換機も探す場合に注意事項を紹介します。
特にUNOの互換機にはUSB-Serial変換チップに純正品と同じATmega16U2ではなく、CH340Gが使われている場合があります。
これはArduino開発環境のドライバとは別にドライバのインストールが必要になり面倒なので、避けたほうが良いです。

コストを下げるためにCH340Gが使われており、この手の物は他の部分でも作りが雑で同じ互換機でもATmega16U2が使用されているものより質が悪いことが多いです。
AliExpress等で中華互換機を探すと全体的にATmega16U2と比較して極端に安いものが多いですが、手間と質を考えるとATmega16U2の方が色々と楽になります。
(ATmega16U2の物は安くても1000円前後するのに対して、CH340Gのものは300円ほどからある。)

またCH340Gは機能ICでUSB-Serial専用チップです。プログラムの書き換えができるのATmega16U2と違い、ファームウェアを書き換えてAVRライタにしたり、USB-MIDIで遊んだりはできません。

始めは割り切って買ったとしても、後から色々と不具合が出るので、ATmega16U2が使われていることをチェックして購入することをお勧めします。

UNOと同じくATmega16U2を使用しているMega等にも言えることですので、気を付けてください。

Raspberry Pi Pico で MicroPython

Raspberry Pi Picoを入手したので、MicroPythonで遊んでみました。
C/C++で開発してネイティブで動作させることもできるのですが、MicroPythonの方が手軽に遊べるのでRaspberry Pi PicoはMicroPythonで遊ぶことにします。

この手物のはインタプリタは遅くてコンパイルされたネイティブなバイナリコードを直接動作させるイメージがあるのですが、それは一般的に組み込み用のCPUがPCと比較して非力で動作が遅いというのが原因だと思います。
その点Raspberry Pi PicoはARMベースで動作クロックも133MHzもあるので、使用してみると思ったより快適で十分だと思います。まだそんなに高度なことはしていないので、ArduinoでC/C++で動作させるのと感覚的に同等で速度的にも気にならなさそうです。
PHPやJavaScriptからプログラミングを始めた人はわかりませんが、昔のPCでBASICから始めた人はコンパイル言語は憧れでどうしてもC/C++の速度に頼りがちになりますが、十分な速度で動作する場合はインタプリタの方が手軽で良いですね。
Raspberry Pi PicoでMicroPythonを動作させると、0.23W前後で動作しています。

開発環境はThonnyを使用します。
Thonny, Python IDE for beginners
個別にMicroPythonのファームウェアを書き込んでシリアル通信でソースを転送して実行という使い方もできると思いますが、Thonnyだとファームウェアの書き込みからソースの編集、実行まで簡単に出来るので便利です。

ソースファイルはRaspberry Pi Pico内のフラッシュROMに書き込まれます。ファイル単位なので、複数管理できます。
ファイル名を"main.py"とすると、電源投入時に実行されます。

Pythonシェルも使用できるので、リアルタイムにピンや接続したモジュールの値も確認出来て便利です。
例としてGP16にタクトスイッチを接続したとして、

sw1 = machine.Pin(16, machine.Pin.IN, machine.Pin.PULL_DOWN)
sw1.value()

で押下状態を確認できます。

参考にThonnyでMicroPythonを書き込むまでの手順です

Thonnyを起動してから、Raspberry Pi PicoのBOOTSELボタンを押しながらUSBを接続してください。
メニューの[ツール]-[Options...]を選択して開いたダイアログで[インタプリタ]タブを選択してください。
ここで"MicroPython (Raspberry Pi Pico)"を選択すると、MicroPythonのインストールダイアログが開いてインストールできます。

Raspberry Pi Pico

Raspberry Pi Pico

  • メディア: エレクトロニクス

FPGAで遊ぶ 基本編

今回は比較的入手しやすいDE0-CV 開発キットを使用して解説します。
これは INTEL (ALTERA) のFPGAのCyclone Vを搭載した入門用FPGA開発キットで、ボタンやVGA出力等の豊富なI/Oが初めから搭載されています。

ハードウェア記述言語はVerilog HDLを使用します。
今回は機種依存の書き方はしないので、基本的にXILINXや他のFPGAでもそのまま使用できます。
INTEL (ALTERA) のFPGAは開発環境としてQuartusを使用します。ここではQuartusの使用方法やピンの配置方法は説明をしません。

単純な回路の例

まずはVerilog HDLのソース

module sample01(LED, KEY);

    input [3:0] KEY;
    output [3:0] LED;
	 
    assign LED[3] = KEY[3];
    assign LED[2] = KEY[2];
    assign LED[1] = KEY[1];
    assign LED[0] = KEY[0];

endmodule

このソースの意味はKEYを入力に設定、LEDを出力に設定、KEYとLEDをそれぞれ接続しています。

ソフトウェアのプログラム言語に慣れていると「LED[3] = KEY[3]」を実行した後に「LED[2] = KEY[2]」が実行されてるように思いがちですが、このソースの場合はLEDとKEYをそれぞれ論理的に配線をして、リアルタイムに電気が流れます。

DE0-CVの場合のピン配置を下の様に設定してください。

Node Name Location
KEY[3] PIN_M6
KEY[2] PIN_M7
KEY[1] PIN_W9
KEY[0] PIN_U7
LED[3] PIN_Y3
LED[2] PIN_W2
LED[1] PIN_AA1
LED[0] PIN_AA2

これをDE0-CVで実行した場合は4個のLEDが点灯されていて、タクトスイッチを押すと対応するLEDが消えると思います。
タクトスイッチを押してLEDが消えるのは、タクトスイッチがプルアップされているからです。普段は電気が流れていて、ボタンを押すと電気がGNDに流れるのでOFFになります。

ソフトウェアで処理する場合はクロック等を上から順番にトリガーにしてタクトスイッチの状態を順番にLEDに渡すようなイメージですが、ハードウェアで処理する場合は単なる配線なので常に同時に電気が流れてリアルタイムで同時に処理ができます。例えばGPU等の様にソフトウェアで処理できることもあえて専用のハードを使う意味が分かりますね。

Wio Terminalで軽く遊んでみました Wi-fi編

発売されて人気のあるWio Terminalで遊んでみました。
M5Stackがあれば良いと思ってたのですが、結構話題になっているようでつい買ってしまいました。

自分用のメモも兼ねて、Wi-fiに接続するサンプルを書きます。

Wi-fiのコントローラはESP32と違いSoCとは別にRealtek RTL8720が使用されています。
まずはRTL8720のファームウェアのアップデートとArduinoのライブラリの追加をします。

手順は公式サイトを参照してください
Wio Terminal Network Overview
https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/

Wi-fiに接続するサンプル
#include "AtWiFi.h"
#include "TFT_eSPI.h"

const char* ssid = "(WI-fiアクセスポイントのSSID)";
const char* password =  "(WI-fiアクセスポイントのパスワード)";

TFT_eSPI tft = TFT_eSPI();

void setup() {

  WiFi.mode(WIFI_STA);  // ステーション(子機)モードに設定

  tft.begin();
  tft.setRotation(1);
  tft.setTextColor(TFT_WHITE, TFT_BLACK);
  tft.fillScreen(TFT_BLACK);
  tft.setTextSize(2);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    tft.setCursor(10, 10);
    tft.printf("Connecting to WiFi...");
  }

  tft.printf(" OK");
  tft.setCursor(10, 30);
  tft.println(WiFi.localIP());

  WiFi.disconnect();
}

void loop() {

}

実行結果
f:id:uosoft:20200526144753j:plain