セリアや100円ローソンで売ってる108円アンプの基板を眺めてたら
…これ、基板、そのまま使うの良くねーか?っとおもいついたので
attiny13を駆動させる実験パッケージにしてみました。
使ってるのは以下のモノです。
1、セリアオーディオアンプ 108円
2、ダイソー万歩計 108円
3、ATtiny13 54円
4、8pinICソケット 20円
5、配線材少々
300円弱のパッケージですね。
○108円アンプの加工。
単4が2本で3Vがとれ、スイッチボリュームがあり
入力用オーディオプラグケーブル、出力オーディオジャックがついております。
裏を開くとこんなです。
ハンダづけも微妙にアレですが、問題なくアンプとして駆動しております。
なぜかGNDに赤い配線という違和感。
電池の配線と、オーディオプラグ(後で使います)の配線をはずして基板だけ取り出します。
よくこれだけの部品を使いながら100円で売れますね。
こっから以下の部品を除去します。部品箱行きです。
オペアンプ
1Ω抵抗
1kΩ抵抗(後で使います)
10uF電解コンデンサ
103セラミックコンデンサ
104セラミックコンデンサ(1Ωの抵抗の近く)
取り外しにはハンダ吸い取り器を使いました。
自分は学生時代から部品とりはこれでやってます。
上手に使わないと基板のパターンを痛めますが。
基板上に残るのは
スイッチボリューム
220uF電解コンデンサ
104セラミックコンデンサ(ボリュームの近く)
オーディオジャック
の4部品です。
オペアンプのついてたとこに
ICソケットをつけ、
取り外した1kΩの抵抗を、写真のようにナナメにつけます。
さすがに思いつきのままには行かず、基板加工要でした。
4箇所パターンカットします。
1、電源からICの2番ピン(OPアンプへの電源供給)パターン
2、ICの6番ピン根元
3、ICの3番ピンとオーディオジャックGNDを接続するパターン
4、ICの1番ピンとオーディオジャックの上端子を接続するパターン
更に3箇所ジャンパします。
1、GNDからオーディオジャックのGND端子
2、VCCからICの8番ピンへ電源供給。
3、ICの6番ピン根元からオーディオジャックの出力へ外部Out
前回の「tiniy13デバッグ」とほぼ同じプログラムをtiny13に書き込みソケットにさします。
(パルス出力をPB1に、ADコンバータ入力をADC2に変更、実は他にもいじったけど)
回路構成です。シンプルです。
IOポートはまだ3本空いています。センサやスイッチやLEDがつけられます。
PB0からボリュームへの電力供給してますがVccからにすれば
もう一本ポートがあけられます。(電池の消費は大になりますが)
○万歩計の加工
取り外したオーディオプラグを、ダイソー万歩計内部のRESETスイッチに
写真のように接続します。
RESETスイッチの右側にはGND、左側に信号がくるように。
また万歩計内の赤配線もRESETスイッチ左側に接続します。
オーディオプラグをショートさせるとカウントアップされることをチェック。
で、ふたつをつなぎます。当然、前のと同じ動きをします。
何がいいかって、乾電池とスイッチですがな(笑)
miso mosi reset sck gndを外に出してプログラム書き換えたいな。
○このパッケージの枠でなんか作りたいなと。
★ちなみにオーディオ出力に無理矢理PB1を使用したのはPB1がtiny13のPWM出力ゆえ。
上手く使えばボリューム値=>tiny13で加工した音声信号がヘッドホンに出せるかもなわけです。
可変要素は1つだけだが、Tinyぴこぴこが作れるか?
#include <avr/io.h>
#include <util/delay.h>
#define cbi(addr,bit) addr &= ~(1<<bit)
#define sbi(addr,bit) addr |= (1<<bit)
void delayms(int ms) {
int n;
for(n = 0 ; n<ms ; n++)
_delay_ms(1);
}
void pulseOut(int ms,int wait) {
cbi(PORTB,1);
//指定ミリ秒間出力0を維持
delayms(ms);
sbi(PORTB,1);
delayms(wait);
}
//指定チャネルからADC値を8ビット取得
uint8_t getADC(uint8_t ch)
{
ADCSRA |= _BV(ADEN);
ADCSRA |= _BV(ADPS2)|_BV(ADPS1)|_BV(ADPS0);
sbi(ADMUX,ADLAR);//上位8bit
ADMUX |= ch;//ADCchセット
sbi(ADCSRA,ADIF);
sbi(ADCSRA,ADSC);
loop_until_bit_is_set(ADCSRA,ADIF);
return ADCH;
}
int main(void)
{
int rstwait = 400;//resetパルス幅
int clkwidth = 2;//Sigパルス幅
int clkwait = 10;//パルスの待ち時間
uint8_t outvalue = 0;//万歩計への出力数値
uint8_t innervalue = 0 ;
int timepassed = 0 ;//だいたいの時間経過
int timeth = 60 ;//強制resetをかける経過時間
//AD変換可能なポートを入力に設定
DDRB = ~0b00111100;
PORTB = 0b00111100;
//ポートB0(pin5)を出力に設定
sbi(DDRB,0);
cbi(PORTB,0);
//ポートB1(pin6)を出力に設定
sbi(DDRB,1);
//万歩計に0.5秒間0を入れて初期リセット
pulseOut(rstwait,clkwait);
innervalue = 0 ;
//メインループ
while(1){
//①ADC1(pin7)より電圧のAD変換値を取得。
sbi(PORTB,0);//抵抗に電圧を与える
_delay_ms(5);//安定するまでちょっと待つ
outvalue = getADC(1);
cbi(PORTB,0);
if ( outvalue > innervalue ) {
//②現在保持している値よりADC2の値が大きければ
//1パルス入れカウントアップ
pulseOut(clkwidth,clkwait);
innervalue++ ;
} else if ( outvalue < innervalue || timepassed > timeth ) {
//③逆に小さければ、万歩計をリセット。
//時間経過で液晶がOffになるので適当にリセット入れる
pulseOut(rstwait,clkwait);
innervalue = 0 ;
timepassed = 0 ;
} else {
//変化がない場合は0.1秒待つ
_delay_ms(100);
timepassed ++;
}
}
return 0;
}
おおー、アンプからマイコンBOX(?)への大変身ですね
返信削除DDSでの音出しは10kHz/8bitぐらいならいけそうです
1MHz / 10kHz = 100[Clock] = 100[uSec]
→8bit演算なら入出力のwait次第では位相変調する余裕もあるかも
1Byte(8bit) * 256 = 256[Byte]
→1KByteのFlashメモリに2~3波形いける?
アンプの入力部も活かせれば300円サンプラーっていうのも
あ~メモリが足りないか
縛りに耐えるどMの世界になりそうです
ぴこぴこマシンのファームをパクってちょっとやってみようかと思います。
返信削除秋月には売ってないですがマルツでtiny45って手はありますね。
http://www.marutsu.co.jp/shohin_40453/
秋月のmega168と価格差がないのが癪ですが、ピン配置同じで4kなのでかなり余裕ができます。
亀甲天井釣りから目隠し手首くらいのソフトに持ち込めます。
http://www.marutsu.co.jp/shohin_40455/
返信削除あ…こっちのがいいか。全然余裕がでてきた。
Arduinoもいけそうな。
五月雨で書いてます。
返信削除データシート見ると、ATTINY85はl2c使えるのね。
ちっこいのにパワフルなやつですね
返信削除外部クロックがいるかと思ったんですが
こいつなら内蔵クロック8MHzでOKか
入出力以外はArduinoの機能は使ってないので
ほとんどそのままコピペで動くかもしれないです