カテゴリ:arduino, AVR( 78 )

Japanino ArduinoISPで ATtiny13 で 100均ブザー (8/14)

100均のキッチンタイマーでちょっと作成しようとしているので、それに付いていたブザーを調べるのにATtiny13でブザーを鳴らしてみる。

ブザーには電子ブザー、圧電ブザーの2つがあって、電子ブザーなら電圧をかけるだけで音が鳴るのに対し、圧電ブザーは矩形波を発生させて音を鳴らしてやらなければならない。
どちらのブザーなのかよくわからなかったので、単三電池を繋いで見たが、接触時のみ雑音のような音が一瞬出るだけで、抵抗が必要なのか電子ブザーでなかったのかわからない。Arduinoのtone関数(IDEに存在するスケッチ例でいうtoneMelody内の関数)で鳴らして鳴るようなら、作成例からも圧電ブザーのような気がする。

ということで、ATtiny13にArduinoを載せるbitDuinoの出番。
ついでに最新のArduino IDE にする。
Arduino 1.8.3に最新のbitDuinoがいつものサイト様にある。

こちらからbitDuino_2017がArduino 1.6.x と 1.8.xに対応しているので、これを説明の通りにDocuments/Arduino/hardwareにコピー。
IDEを再起動すると有効になる。それぞれ設定は以下の通り。ボードマネージャやライブラリインクルードなどは使わない。
a0034780_22422380.png
tone関数もATtiny13に対応したものが、同じページの示すサイト様にある。

ATtiny10とATtiny13の両方に対応しているが、ATtiny10はまだ未完成だがATtiny13にはそのままで対応しているようだ。
ただし、tone関数の第3引数は削除されているようだ。その新たなライブラリは同サイト様の以下のページにある。

そこにある「toneSampleSketch.zip」をダウンロードというリンクからATtiny13のスケッチを取得。
同ページに表示されているソースはATtiny10の物なので今回は無関係。つまりtoneCycleMelody関数、メモリが少ないうんぬんはATtiny10の事なので、ATtiny13はIDEに内蔵のtoneMelodyのスケッチとほぼ同じ。

ダウンロードしたスケッチを開き、回路を組んでNew ATtiny13をセット(8分周のままなので1.2MHzを選んだ)。
抵抗は100均のチップ抵抗を見ると102なので10x10^2=1000Ω=1kΩを。ピンはソースからspk=4よりPB4をブザーのプラスにGNDをブザーのマイナスに。そのどこかに抵抗をはさむ。
コンパイルもそのまま通り書込みもOK。

「最大1024バイトのフラッシュメモリのうち、スケッチが788バイト(76%)を使っています。
最大64バイトのRAMのうち、グローバル変数が25バイト(39%)を使っていて、ローカル変数で39バイト使うことができます。」
メッセージも日本語で凄く親切。

実際鳴らすと音が小さい。100Ωにするとずいぶん大きくなる。きっとキッチンタイマーの省電力対策なのだろう。

これで圧電ブザーという事がわかった。同じようなものは 秋月電子通商のUDB-05LFPN 80円か。ボタン電池LR1130(1.5V)やレギュレータも載って液晶まで付いて凄いコスパだ。

Arduino(Japanino)ライタを使ってるのでbootloaderを使ってないので容量は788バイトで済んでるが、さらに少なくするならArduino IDEの関数を使わず直接ポートをアクセスするようIDE上で書けば削減される(pinModeなど)。この時bitDuinoの関数を使わなければbitDuinoのインストールは関係なくなる。

P.S.
書込み装置:Arduino as ISPならbootloaderは不要だが、Fuseビットを書き換える処理もしているので、9.6MHz(Internal)を選んでブートローダ書込みを実行後にマイコン書込みすれば指定のClockで動作可能。

P.S.2
今回bitDuinoをインストールしているのはATtiny13用のArduino IDE関数(pinMode,tone)がbitDuinoによって置き換えられているからで、今までの1.5.2の環境などではこれらの関数を使わず、その代わり直接ポートやレジスタをアクセスするavr-gccの関数を使用しているのでbitDuinoはインストール不要。正確にはmain関数がinit関数を呼び出しているので、多少のArduino IDE関数を使っている。
avr-gcc関数:avrの標準C/C++関数
Arduino IDE関数:avrの関数に使い勝手が良いようにどんなavr MCUでもソースが共通になるようなラッパー関数
bitDuino:そのラッパー関数をATtiny13/10でも使えるように書き換えたもの

[PR]
by k1segawa | 2017-08-14 22:03 | arduino, AVR | Comments(0)

Japanino ArduinoISPで ATtiny13 で 色々 - 海外の電子工作 (7/28)

ATtiny13をメインに電子工作していたが、特に何か作りたい物がネットを徘徊してもなかったのだが、海外に目を向けると色々あって面白い。
前の記事 Pinterest と 電子工作 (6/17)もそうだが、下記のサイト様はATtiny13のマイコンとしての基本機能をいくつか網羅していてマイコン初心者に便利。

a0034780_17395410.png
Links

というリンクに100個色んなプロジェクトをやってみるというのがあり、ここにATtiny13による「ソフト UART」や「ウォッチドック」、「dance lights with FFT」 など基本から応用がまとまっている。

100個はないがそれでも回路図が簡単で、プログラムもCソースが短くて、簡単にArduino IDEに流用できる。

例えば「ウォッチドック」の「[005] ATtiny13 – blinky with Watchdog Timer」なんかは、
[回路図]
a0034780_17202373.png
[元ソース]
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define LED_PIN PB0

ISR(WDT_vect)
{
PORTB ^= _BV(LED_PIN); // toggle LED pin
}

int
main(void)
{
/* setup */
DDRB = 0b00000001; // set LED pin as OUTPUT
PORTB = 0b00000000; // set all pins to LOW
// set prescaler to 0.5s and enable Watchdog Timer
wdt_enable(WDTO_500MS);

// enable Watchdog Timer interrupt
WDTCR |= _BV(WDTIE);
sei(); // enable global interrupts

/* loop */
while (1);
}

となるのだが、
/* setup */をsetup()内に移植し、/* loop */がwhile(1);なので単にloop()を呼び出す。それ以外はそのまま記述するだけ。

[Arduino IDE用 新ソース]
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

#define LED_PIN PB0

ISR(WDT_vect)
{
PORTB ^= _BV(LED_PIN); // toggle LED pin
}

void setup() {
/* setup */
DDRB = 0b00000001; // set LED pin as OUTPUT
PORTB = 0b00000000; // set all pins to LOW
// set prescaler to 0.5s and enable Watchdog Timer
wdt_enable(WDTO_500MS);

// enable Watchdog Timer interrupt
WDTCR |= _BV(WDTIE);
sei(); // enable global interrupts
}

void loop() {
}


色々まとまってて面白いわー

[相互変換]
Cソース → Arduino IDE ソースは上のような感じで。
Arduino IDE ソース → Cソースは以下の記事のように。


[PR]
by k1segawa | 2017-07-28 17:01 | arduino, AVR | Comments(0)

ブレッドボードを卒業して、エッチング無しで最小限の半田付けで基板を作る (7/16)

ブレッドボードで作った回路を恒久的に使いたい時、振動や錆びによる接触不良を無くすため、ユニバーサル基板やプリント基板で半田付けするが、ユニバーサル基板だとドット間を導線で繋いだり、プリント基板なら半田付けの前に廃棄に困るエッチング液でパターンを腐食させなければならない。

昔100万円であった切削型のCNCが、今なら10万円まで下がってきた。これならエッチングいらずでプリント基板が作れるが、騒音と切り屑の処理が大変。

そこで、ちょっと手軽にサンハヤトのワイヤード・ユニバーサル基板やブレッドボードパターンのユニバーサル基板、銀箔テープ、EジスPenで作成する方法がある。
それぞれサイト様の代表的な画像とリンクを示す(画像の著作権はサイト様にあります)。

ワイヤード・ユニバーサル基板 UB-WRD01 - サンハヤト株式会社
(リューターは滑るので刃の鈍ったカッターで削る)
a0034780_02184902.jpg

秋月電子のユニバーサル基板(ブレッドボードタイプ)
片面ユニバーサル基板(ブレッドボード配線パターンタイプ) Dタイプ(47x36mm) ガラスコンポジット
a0034780_02194053.jpg
銀箔テープ
2010年01月18日 物の無い時代に育った - 第九研究室だより:電子工作
(幅広のままドット型のユニバーサル基板に貼ってカットする)
a0034780_02205691.jpg
プリント回路基板の簡単製作手順
a0034780_02513572.jpg
EジスPenを使ってみる_1/3
(何回か上塗りしすぐに20分ぐらいドライヤーで乾かす)
a0034780_02221475.jpg
それぞれ少しコストはかかるが、部品の半田付け以外に高熱を必要としないので割と手軽に作れる。
簡単な回路なら初心者がブレッドボードを卒業していきなり玄人っぽく半田付けするよりは敷居は低いだろう。

[PR]
by k1segawa | 2017-07-16 02:39 | arduino, AVR | Comments(0)

arduinoによるオシロスコープ4 - arduino基板の スペーサ代わりにホットメルトを使う (7/15)

arduinoやIchigoJam、RaspberryPiなどのむき出し基板は、裏の金属部分が床から少し離れるように「スペーサー」というものを取り付ける。
プラスチックや金属製のものがあるが、長さや値段から買うのを忘れてしまいがち。

そこで、100均で買えるグルーガンの溶かす棒(ホットメルト接着剤)を、切ってくっつける。そしてくっつけるにはグルーガンで表の穴に少しホットメルトをたらしてやればいい。

常温でべたべたする事もなく、しっかりとくっつく。

以下はオシロスコープで使ったびんぼうでいいの、の基板に取り付けた様子。
a0034780_10572653.png
12MHzクリスタルの背が高いのが横向いてるのはご愛敬ということで。
a0034780_10573276.png
a0034780_10573944.png
そこそこ綺麗なんじゃない?
長さも自由だし、値段も100円で何十回もとれるし、全然安い。
また熱してやれば取り外しも簡単。

太いのと、長いと強度が下がる欠点はあるけど、単に床に設置させないためにはこれで十分。

100均使えるわー

[PR]
by k1segawa | 2017-07-15 11:08 | arduino, AVR | Comments(0)

ボードコンピュータの液晶制御が高速処理のピークな理由 (7/11)

arduino や Raspberry Pi などのボードコンピュータが液晶の表示を性能のリトマス試験紙としているのはなぜかわからなかった。
より高性能なCPUにしたりクロック数を上げたりして高精細液晶画面を制御しているのを競っているのが、なぜPCから画像データを液晶へ直接送信せずにわざわざボードコンピュータに送って(または書換可能メモリに保存して)表示させるのか、今の高速なPCならどんな大きいデータでも簡単に液晶に送れてすいすい画像を書き換えられるのだと思っていた。

ところでPCから外部にデータを送信するためには現在はシリアル通信であるUSBやRS-232C、バスであるPCI Express、表示と音声データに特化したHDMIがある。
これらで、ユーザが直接制御出来るのはUSBやRS-232Cであり、それ以外はドライバやOSのライブラリを介して間接制御するしかない。

ボードコンピュータは液晶を制御できるのだから、PCだってUSB2.0や3.1などの高速な通信を使えば軽々液晶を書き換えられる(例えばマスクやグラフィック描画)のではないか。

USBはなかなか難しいので市販のUSB制御ボードを使うとすると、以下のようなものがある。

これのソフト仕様を調べる(ヘルプファイル参照)と、1ビット書き換えに10000回/2500msecぐらいの時間がかかる。8ビット(1バイト)でも10000回/5000msecぐらい。
これはデジタルポートをON/OFFする速度と仮定すると、10000/2.5秒=4000Hz、10000/5秒=2000Hzで書き換え出来る。
USB2.0が480Mbps(1.0が12Mbps)なので、480M/10ビット(8n1)=48Mバイト/sec。プロトコルなので上のON/OFFに変換するとざっくりだが48000000バイト:2000バイトをどうにかできるとして2万4千分の1のデータ効率。

赤外線 搬送波が37kHz程度なのだが、これが上の制御ボードでは全然間に合わない。
でも赤外線のコントロールは昨今のボードコンピュータでは当たり前に出来ている。

USBシリアル変換ケーブルなどを使って、RS-232Cの最大速度115200bpsだと、約1万バイト/sec。8ビット送信できるとして80kHz程度(もう単位とか転送速度とかぐちゃぐちゃだが)は処理できるとしてギリギリ赤外線の制御が出来るかなという所。

USB2.0でハードディスクへのデータ転送が可能になったのだから相当速いのかと思ったが、プロトコル負荷によって赤外線の制御程度がやっとなのか。

PCからUSBで画像データを液晶に直接転送しても4000Hzだと8x8マトリクスLEDのON/OFFでさえも64個のLEDをせいぜい1個当たり4000/64=62.5Hzでしか書き換えられない。秒間62回だ。24fpsが秒間24コマなのに、こっちはLEDをON/OFFするだけにこんなにかかってたら、1コマの画像転送なんてとんでもない。

PCから高精細液晶を制御するのはUSBでは夢物語なのか。USBケーブルのサブモニタは差分データ送信でうまくやってるのかな。

USB2.0 480Mbps=0.48Gbps(ざっくり)
USB3.0 10Gbps
PC Express 3.0 8Gbps
HDMI 2.0 18Gbps

HDMIを直接PCが制御する訳では無くWindowsならDirectXでコマンドをGPUが受け取って膨大なピクセルをCPUコアが書き換えている。

ボードコンピュータが液晶を書き換えられるのは、PCのUSBのプロトコル負荷で通信スピードが上がらないという部分が無いから現実に出来るのであり、ボードコンピュータじゃなければユーザは直接液晶を操作できないのだ。HDMIの転送速度を生かして表示を制御するにはGPUのコマンドをプログラムすればいいが、そこに力を入れるのはちょっと違う気がする。少し前にCUDAとかで流行ったけど。

という事で、PCから外部にデータを高速転送する手段がないため、大量のデータである液晶(表示)書換は、今の所PCからは無理で、そのため液晶を自分でコントロールする気になるためには、ボードコンピュータに制御させるのが手っ取り早いのだ。で、高負荷なのでボードコンピュータはどんどん高性能になって行く。でも痛し痒しでどうしても「ボードコンピュータ」というワンクッションが入ってくる。

ああ、液晶(表示)制御を高精細で極めようとするとPCでは現在のインターフェースでは無理(OSもRTOSにならないと)で、ボードコンピュータでも高性能なちょっと敷居の高い事になってしまうのだ。

やっぱり「表示器」はPC上で行ない、ボードコンピュータはリアルタイムでは表示機能を持たないのが最善手(単体のボードコンピュータはそれはそれで完結していてもいいが)だな。つまりボードコンピュータのネット上での役割はセンサーと物理制御(サーボ出力、リレーON/OFF)だ。

備忘録、備忘録。

すぐボードコンピュータに液晶をつなごうとしてしまうが、単体で完結するもの(ゲームコンソールやなんらかの指標器)を作るとき以外は上の事を思い出して、踏みとどまろう。
まあ、もう128x48のグラフィック液晶買ってきちゃったんだけどね。


[PR]
by k1segawa | 2017-07-11 22:15 | arduino, AVR | Comments(0)

Pinterest と 電子工作 (6/17)

Pinterest という画像によるブックマーク共有SNSサイトがある。
SNSの形態をとっているが、気になった写真をピンでとめてそれを皆で共有・公開するサイトで、同じ興味のある人を繋ぐ感じ。

トップページの検索で、興味のあるキーワードで他の人がピン止めした写真を検索して、自分も共感すればピン止めする。

するとそれ以降トップページでおススメのピンナップが表示される。

これに対して「電子工作」「arduino」「ATtiny」「電気回路」「Raspberry Pi」などと検索すると、

おすすめに電子工作の色々な画像が表示される。

Pinterestのおすすめが秀逸で、ちょっとgoogle検索では出てこないような突飛なケースが発見できて面白い。

google:独自の検索アルゴリズムでページに得点を与え、キーワードと関連付ける
twitter:#ハッシュタグでツイート者が付けるタグで検索する
Pinterest:画像に対してピン止めした人が付けたコメントで検索する

全ての情報を把握するgoogleという勢力に対して別のデータベースを持ち、フラットな検索ルールで情報を提供していて、面白い。
googleではいつも同じになってしまう検索結果が、Pinterestやtwitterではどんどん変化しており、リアルタイムの情報が取り出せるような気が。

新しい事が見つからない時ぜひ。
(自分は日本の電子工作の行き詰まりで使ってる)

google一極の検索世界に風穴が空いた。


[PR]
by k1segawa | 2017-06-17 01:26 | arduino, AVR | Comments(0)

Atmel Visual Studio 7.0 文法チェック OFF (5/1)

上記の件、新しいIDEはコメント内の日本語の一部に下波線がついてとてもウザイ。6.4ではなかった機能だ。
すぐ上で定義している#define や 関数マクロもダメ。文法エラーにも法則性が無いので、日本語化は単にリソースにパッチを当ててるだけなのだろう。

オフにするには次のように[メニュー] [VAssistX] [Enable/Disable Visual Assist]を選んで OFF にする。
a0034780_11235761.png
言語対応が中途半端で、メニューもサブメニューとかまったく日本語化されていない。Visual Studioベースだから言語パックを用意するのは難しくないはず。それともコメント内だけオフに出来るのだろうか。

[PR]
by k1segawa | 2017-05-01 11:26 | arduino, AVR | Comments(0)

Japanino ArduinoISPで ATtiny13 で うんぬん - 前提の変更 (4/29)

今までJapanino + ArduinoISP + ATtiny13であれこれやっていたが、前提条件が間違っていた。

Arduino IDE 018 で Japanino を Arduino ISP ライタ(ハードウェア)にし、ライタ"ソフト"としては avrdude (ver 5.11 - ATtiny13をサポートしている版)を使って、次のような環境で、ATtiny13A に書込みをしていた。

(1) Arduino IDE 1.0.5-r2 で ATtiny13A に スケッチを書き込み
(2) BASCOM-AVR で ATtiny13A に HEXファイル書込み
(3) Atmel Studio 7.0 で ATtiny13A に HEXファイル書込み

ちなみに avrdude は C:\avrdude に配置し、avrdude.conf は バージョン1249「$Id: avrdude.conf.in 1249 2013-10-18 07:59:06Z springob $ -*- text -*-」だ。

で、何を間違っていたかというと、「bitDuino + Arduino IDE 1.0.5-r2 という組み合わせで使っている」という表記だ。

実はbitDuinoをふふふ様や構想100年様のサイト通りにインストールすると、<展開先ディレクトリ>/arduino-1.0.5-r2/hardware/の直下に解凍済みファイルが存在するはずで、それはbitDuinoディレクトリかまたはその内容のはず。
そしてインストール後のArduino IDEメニュー>ツール>マイコンボードの先には"bitDuino13 (internal 9.6MHz clock)"と出るはず。

しかし、私の今のArduino IDEにはそのような表記は無く、単に"ATtiny13 (internal 9.6MHz clock)"となっている。(arduino 1.0.5-r2)

つまり、bitDuino を使っていないのだ。

ぼんくらでごめんなさい。

ずっと bitDuino を使ってるつもりだったのだが、どうやら arduino 1.0.5-r2 は標準で ATtiny13 をサポートしているようだ。
(もしかすると arduino 1.0.x または 1.6 or 1.7 用のATtiny用hardwareをインストールする必要あり)

今までのサイト内での記事は修正が多いのでここで注意しておく。

==========
(ソフト)
ATtiny13 マイコンのスケッチ書込みには、arduino 1.0.5-r2 (arduino 1.0.x の最終バージョン) を使っています。
(ひょっとすると arduino 1.0.x か 1.x 用の hardware のインストールが必要 - インストール後 hardware/attiny/cores が出来る)

(ハード)
Japanino を ライタにする場合 arduino 018 (Japanino のサイトでダウンロード)で行っています。

びんぼうでいいの をライタにする場合 arduino 1.0.5-r2 のブートローダ書込みで行っています。
==========

本当によくわかっていなかった。もしかするとまだ間違っているかもしれない。

きっかけはarduino 1.0.5-r2のanalogReadのソースを参照していた時。__AVR_ATtiny13__ が定義されていないのでおかしいなと思い、ソースのあるディレクトリがhardware/arduino/coresだった。定義されているソースはhardware/attiny/coresの方だった。構想100年サイト様の見直しで、インストールすればhardware/bitDuino/coresになるはずなのに、なぜattinyなのかよく考えてみたら、そもそもインストールに失敗しているという間抜けな結論に達した。

もちろん bitDuino は先達様の素晴らしい構成物です。私の勘違いでその価値が下がる事はない。真面目にインストールして動作しなかったら申し訳ありません。

P.S.
1.0.x または 1.x 用の hardware.zip は色んな方が作ったバージョンがあるので、ダウンロードする際には必要なクロックをサポートしているものを選んで欲しい。
私の hardware/attiny/boards.txt を読むと ATtiny13 用 は

#attiny13-1.name=ATtiny13 (internal 1.2 MHz clock)
:
attiny13-8.name=ATtiny13 (internal 9.6 MHz clock)
:

となっており、内部クロック 9.6MHz のみ arduino IDE メニューに出てくるようになっている。

128kHz や 4.8MHz サポートの hardware.zip もあるので、必要ならそれを。もちろんこれはソフトが「スケッチ」の場合。
BASCOM-AVR や Atmel Studio 7.0 は ハードとしてライタが必要なだけで hardware.zip がどうであろうと関係ない。

また、128kHzはArduino ISPライタでは書込めないようだ。またシリアル15200 bpsより高速の転送速度(PC - Japanino間)はJapaninoのクロックがデフォルトで内蔵クロックだと10%の誤差があるので無理らしい。外部クロック化していたり、arduino/びんぼうでいいの は問題ない。

[PR]
by k1segawa | 2017-04-29 04:24 | arduino, AVR | Comments(0)

Japanino ArduinoISPで ATtiny13 で 導通テスタ2 (4/27)

以前の記事で、Arduino IDEでプログラム(Hex)容量を削減するために関数をいくつか置換したが、digitalRead関数には手を付けていなかった。
今回それも置換してさらにAtmel Studio 7.0でもソースをそのまま動くように置換マクロや関数を用意して容量を比べてみた。

前回のソースではHexは814バイトだったが、今回は以下のソースで648バイトになる。
【ソース】
/*
* ATtiny13A 導通テスタ
*
* bitDuino + Arduino IDE 1.0.5-r2
*
* 機能:PB1とGNDに繋いだプローブで回路の導通チェックを行う
* タクトスイッチ押下で、導通時 ブザー鳴動 <=> LED点灯 のモード切替(切替時点滅)
*
* CPU:ATtiny13A VCC:3.3/5V PB0:ブザー PB1:プローブ+端子 PB3:LED+
* PB4:切替用タクトスイッチ GND:ブザー、プローブ、LED-、タクトスイッチ LED用1kΩ抵抗
*
* ※ただしプログラム容量削減のため pinMode、digitalWritedigitalRead関数を置換
*/

#define M_Wait 500 // ブザー鳴動時間(μs)
// ピン割り当て
// ただし、Arduino IDE(bitDuino)の ピン番号 と ATtiny13Aの ポートBの ピン番号 は同じ
#define M_Buzzer 0 // PB0:ブザー用
#define M_Probe 1 // PB1:プローブ+用
#define M_LED 3 // PB3:LED+用
#define M_Switch 4 // PB4:切替スイッチ用

// レジスタのビットクリア
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
// レジスタのビットセット
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
// ピンの入出力方向設定
// 出力
sbi(DDRB, M_Buzzer); /* eq. pinMode(M_Buzzer, OUTPUT); */ // ブザー
sbi(DDRB, M_LED); /* eq. pinMode(M_LED, OUTPUT); */ // LED
// 入力 & プルアップ
cbi(DDRB, M_Probe); sbi(PORTB, M_Probe); // 導通テスタピン
/* eq. pinMode(M_Probe, INPUT_PULLUP); */
cbi(DDRB, M_Switch); sbi(PORTB, M_Switch); // タクトスイッチ
/* eq. pinMode(M_Switch, INPUT_PULLUP); */
}

void loop() {
// タクトスイッチ 切替状態保持(mode=0:導通時 ブザー鳴動 / 1:導通時 LED点灯)
static int mode = 0;

// モード切替処理
// 切替スイッチ押下か?(プルアップなので押下でLOW)
while( bit_is_set(PINB, M_Switch) == 0 ) {
// eq. while( digitalRead(M_Switch) == LOW ) {
delay(10); // 10ms待ち(チャタリング排除のため)
// 連続してスイッチ押下か?
if( bit_is_set(PINB, M_Switch) == 0 ) {
// eq. if( digitalRead(M_Switch) == LOW ) {
mode = 1 - mode; // 状態反転
// LED点滅
sbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, HIGH); */
delay(300); // 0.3秒点灯
cbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, LOW); */
break;
}
}

// プローブ導通チェック
// プローブとGND間が導通している(プルアップなのでLOW)なら
if( bit_is_set(PINB, M_Probe) == 0 ) {
// eq. if( digitalRead(M_Probe) == LOW ) {
if( mode == 1 ) {
// LED点灯
sbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, HIGH); */
} else {
// ブザー鳴動(矩形波HI/LOW 1周期分)
sbi(PORTB, M_Buzzer); /* eq. digitalWrite(M_Buzzer, HIGH); */
delayMicroseconds(M_Wait); // 矩形波HIの時間
cbi(PORTB, M_Buzzer); /* eq. digitalWrite(M_Buzzer, LOW); */
delayMicroseconds(M_Wait); // 矩形波LOWの時間
}
} else {
// LED消灯
cbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, LOW); */
}
}
赤い部分が修正箇所となる。

そしてAtmel Studioでのソースは次のようになる。
従来のソース変化無しは青い部分だ。
赤い部分は今回必要無いが、手っ取り早くArduino IDEのソースをそのまま持ってくる場合の関数マクロだ。ただし、pinMode関数は三項演算子が2回入れ子になっているのでINPUT/OUTPUT/INPUT_PULLUPモード毎に展開した方が容量削減となる。
【ソース】
/*
* ATtiny13A 導通テスタ
*
* bitDuino + Arduino IDE 1.0.5-r2
*
* 機能:PB1とGNDに繋いだプローブで回路の導通チェックを行う
* タクトスイッチ押下で、導通時 ブザー鳴動 <=> LED点灯 のモード切替(切替時点滅)
*
* CPU:ATtiny13A VCC:3.3/5V PB0:ブザー PB1:プローブ+端子 PB3:LED+
* PB4:切替用タクトスイッチ GND:ブザー、プローブ、LED-、タクトスイッチ LED用1kΩ抵抗
*
* ※ただしプログラム容量削減のため pinMode、digitalWrite、digitalRead関数を置換
*/

//---------- ATmel Studio 7.0 ここから

#ifndef F_CPU
#define F_CPU 9600000UL // 9.6 MHz clock speed
#endif
#include <avr/io.h>
#include <util/delay.h>

// HIGH/LOW(digitalWrite/Read)
#define HIGH 0x1
#define LOW 0x0
// pinMode
#define INPUT 0x0
#define OUTPUT 0x1
#define INPUT_PULLUP 0x2

#ifndef pinMode
#define pinMode(pin,mode) (mode==INPUT?cbi(DDRB,pin):\
(mode==OUTPUT?sbi(DDRB,pin):sbi(PORTB,pin)))
#endif

#ifndef digitalWrite
#define digitalWrite(pin,val) (val==HIGH?sbi(PORTB,pin):cbi(PORTB,pin))
#endif

#ifndef digitalRead
#define digitalRead(pin) (bit_is_set(PINB,pin)==0?LOW:HIGH)
#endif

// delay
#ifndef delay
#define delay(ms) _delay_ms(ms)
#endif
// delayMicrosecond
#ifndef delayMicroseconds
#define delayMicroseconds(us) _delay_us(us)
#endif

void setup(void);
void loop(void);

int main(void)
{
setup();

while(1) {
loop();
}
}

//---------- ATmel Studio 7.0 ここまで

#define M_Wait 500 // ブザー鳴動時間(μs)
// ただし、Arduino IDE(bitDuino)の ピン番号 と ATtiny13Aの ポートBの ピン番号 は同じ
#define M_Buzzer 0 // PB0:ブザー用
#define M_Probe 1 // PB1:プローブ+用
#define M_LED 3 // PB3:LED+用
#define M_Switch 4 // PB4:切替スイッチ用

// レジスタのビットクリア
#ifndef cbi
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))
#endif
// レジスタのビットセット
#ifndef sbi
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#endif

void setup() {
// ピンの入出力方向設定
// 出力
sbi(DDRB, M_Buzzer); /* eq. pinMode(M_Buzzer, OUTPUT); */ // ブザー
sbi(DDRB, M_LED); /* eq. pinMode(M_LED, OUTPUT); */ // LED
// 入力 & プルアップ
cbi(DDRB, M_Probe); sbi(PORTB, M_Probe); // 導通テスタピン
/* eq. pinMode(M_Probe, INPUT_PULLUP); */
cbi(DDRB, M_Switch); sbi(PORTB, M_Switch); // タクトスイッチ
/* eq. pinMode(M_Switch, INPUT_PULLUP); */
}

void loop() {
// タクトスイッチ 切替状態保持(mode=0:導通時 ブザー鳴動 / 1:導通時 LED点灯)
static int mode = 0;

// モード切替処理
// 切替スイッチ押下か?(プルアップなので押下でLOW)
while( bit_is_set(PINB, M_Switch) == 0 ) {
// eq. while( digitalRead(M_Switch) == LOW ) {
delay(10); // 10ms待ち(チャタリング排除のため)
// 連続してスイッチ押下か?
if( bit_is_set(PINB, M_Switch) == 0 ) {
// eq. if( digitalRead(M_Switch) == LOW ) {
mode = 1 - mode; // 状態反転
// LED点滅
sbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, HIGH); */
delay(300); // 0.3秒点灯
cbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, LOW); */
break;
}
}

// プローブ導通チェック
// プローブとGND間が導通している(プルアップなのでLOW)なら
if( bit_is_set(PINB, M_Probe) == 0 ) {
// eq. if( digitalRead(M_Probe) == LOW ) {
if( mode == 1 ) {
// LED点灯
sbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, HIGH); */
} else {
// ブザー鳴動(矩形波HI/LOW 1周期分)
sbi(PORTB, M_Buzzer); /* eq. digitalWrite(M_Buzzer, HIGH); */
delayMicroseconds(M_Wait); // 矩形波HIの時間
cbi(PORTB, M_Buzzer); /* eq. digitalWrite(M_Buzzer, LOW); */
delayMicroseconds(M_Wait); // 矩形波LOWの時間
}
} else {
// LED消灯
cbi(PORTB, M_LED); /* eq. digitalWrite(M_LED, LOW); */
}
}
main.cに上記ソースをまるまる青い部分も含めて貼り付けてOK。Hex容量は、それぞれ Arduino IDE=648バイト、Atmel Studio=578バイト(コンパイルオプション:デフォルト)で70バイトまだ小さくなる猶予がある(delay関係)。
しかし最初置換しないソースはArduino IDE上で1024バイトに収まらなかった事から考えると648バイトは十分だ。

Arduino IDEはほぼC/C++環境なので、ライブラリの充実度で考えるとAtmel Studioにもライブラリは公式にあるにはあるが、Arduino IDEの方が多い。ただし大したことではないがオープンソースなので流用元のライブラリ自体の参照先は明確にしておかなければならない。プログラムソース自体は別にGPL等で公開しなくてもいい。(オープンソースのgccやIDEを使って作った自分の”プログラムソース”自体は別にオープンソースではないので)

あれ?Atmel Studio の立場は?
大規模分散開発やデバッグのしやすさはAtmel Studioの方が優れているが、特に小規模プロトタイプ開発や個人の趣味で作るにはコンパイラは両方ともgccだし、Arduino IDEでよくね?別にAVRマイコンであればほぼ対応しているようだし。GUIをMicrosoftのVisual Studioに作ってもらっている7.0以降、起動が重くてしょうがないしね。



[PR]
by k1segawa | 2017-04-27 17:00 | arduino, AVR | Comments(0)

Japanino ArduinoISPで ATtiny13 で 導通テスタ 検討 (4/22)

前の記事で、導通テスタ(チェッカ)を作ったが、一般の導通チェッカは抵抗によって音の高低が変わったり、電子回路の影響を受けないような回路が組み込まれているようだ。あと電流も余り流さず長期間バッテリが持つようになっている。

そんな難しい事は全然考えていなかった。

単につながるとまずい部分の半田チェック用だ。

まあ自分が作る程度の配線ならこの程度だ。箱やプローブも特に工夫してないし。
あとブザーも発振回路の代わりにマイコンでやっているので、回路内蔵型ブザーというのを使うと、電圧をかけるだけで鳴動するらしい。
発振する処理(矩形波HI/LOと鳴動時間)もいらず、LEDと同じ扱いでよくなる。
電源にもよるかもしれないが、プローブ間にかかる電圧と電流はATtiny13のデータシートをみると、
a0034780_12533892.png
となっており、最大40mAまで流れ、arduinoの5V電源に繋いだ時はこんな具合なのかな。

圧電ブザーも内部には回路が入っているようだ。
詳細はFDK社の詳細情報を請求して取り寄せないとわからないが、こちらのサイト様の図のようになっているのだろう。
ちゃんと作るなら、プローブのPB1-GND間にトランジスタによる増幅回路を入れて、5V Max40mAのON/OFFじゃなくもっと低電流(低抵抗)で動くようにするべきなのかな~
導通チェッカと言っても、回路の大部分は本質的な所ではなくて、検出した信号をLEDやブザー鳴動に変換する機能を実現する場合が多い。

だからそこはマイコンに置き換え、実質的な検出回路部分を工夫した回路をPB1-GND間に当てはめて高精度化したい。

皆さんが参考にしている記事は2008年の記事で、J:COMからの移転のため、左のカテゴリは機能しているが、アーカイブは旧J:COMのサイトにリンクしているためNot Foundになってしまう。しかたがないので、カテゴリで絞って記事末尾の「次へ」を次々クリックしてたどり着く。
こちらのサイト様の回路が高精度化されている。もっと先には

のようにたった0.3Ωの低抵抗で導通していない事を検出できる改良がなされている。

やはり製品化されているだけの事はある。こちらの末尾に旧ブログ記事への導通チェッカ―の関連リンクがある。



[PR]
by k1segawa | 2017-04-22 12:44 | arduino, AVR | Comments(0)