カテゴリ:arduino, AVR( 72 )

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)

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

導通テスタが欲しかったのだが、簡単な回路がなかったのでATtiny13Aマイコンで作ってみた。

ブザーを鳴らす、ボタンをチャタリング無しで押す、プルアップ回路のスケッチを集めて適当にリファクタリングしてプログラムを作成。
ブザーが無かったのでイヤホンを分解してピンヘッダに半田付けしてグルーガンで固め、ブザー鳴動とLED点滅の2つの表現をタスクスイッチで切り替えるようにした。

単4電池ボックスやボタン電池、ACアダプタのいずれでも動作。回路に直接ライタを結線してもとりあえず動作。
ソースはArduino IDE 1.0.5-r2のスケッチで。Japanino上でATtiny13用にbitDuino導入済み。arduino Uno(Japanino)はardunio ISPライタ化済み。

【実体配線図】
a0034780_22515608.png
ライタ部分と比較しやすいように並べた。ポータブル時はarduino Unoからの6本の線をはずし、電源を繋ぐ。

【回路図】
a0034780_22521456.png
回路は簡単だが、電源GND間にセラコンとかいるのかな~。2入力2出力で8ピンマイコンで十分だ。

【写真】
a0034780_17393882.png
イヤホンやプローブは100均の園芸用の針金0.5mm(配線にも使用)で固定。

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

#define M_Wait 250 // ブザー音程(鳴動時間:μs)
// ピン割り当て
// ただし、Arduino IDE(bitDuino)の ピン番号 と ATtiny13Aのデータシートの ピン番号 は同じ
#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( digitalRead(M_Switch) == LOW ) {
delay(10); // 10ms待ち(チャタリング排除のため)
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( 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); */
}
}



[PR]
by k1segawa | 2017-04-20 23:01 | arduino, AVR | Comments(0)

arduinoによるオシロスコープ3 (4/17)

実際に回路に繋いだ状態を示す。
例:ATtiny13Aにarduino IDEのサンプル "Fading"(LEDをPWMで明滅させる)というスケッチを書き込んだもの

【配線図】
a0034780_00213370.png
PWMはint ledPin=0;(PB0ピン)に変更。ATtiny13Aでarduino IDEを使うにはbitDuinoを組み込みます。詳しくは以下のサイト様へ。
【実際の写真】
a0034780_22224878.png


CH2用に青いICクリップを付けている(P.S. CH2用のGNDはいらないのかな)。
a0034780_22231732.png


CH1用の赤いICクリップをLEDの足(PB0)を、GNDの黒いICクリップを抵抗のGND側の足をはさみます。

GIF画像でPWMを計測した様子を以下に示す。

【オシロスコープの様子】
a0034780_00495848.gif
上半分がPWM(デューティ比 0~255に変化:明るさが段々暗くなる)の様子、下半分がFFT。FFTのパラメータは画像の通り。
周波数が高いほど左で右に行くほど周波数は少なくなる。周波数の発生頻度が多ければ縦軸が高くなる。

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

arduinoによるオシロスコープ2 (4/17)

九州工業大学のKyutech Arduino Scopeだが、配線図がはっきりしないので、Fritzingで作ってみた。

【オシロスコープ 配線図】
a0034780_10425835.png
部品は抵抗1kΩ 3本、100kΩ 1本、セラミックコンデンサ1μF(耐電圧16~50Vまで何でも)だけ。配線は簡単。普段使うのはA1~3の入力端子(CH1/2/トリガ入力:赤/青/黄)とGND。EXTは外部という意味。

【使い方】
まず初期化として、プローブの校正を行う。

【PULSE出力の使い方】
a0034780_10523230.png
こんな風に入力端子CH1、CH2をPULSE出力に繋ぐ(トリガ入力は校正しないのかな?)。PUSLE出力は校正用信号として使うのだ。

その結果Processing画面に表示されるのが下の画像。

【校正画面】
a0034780_10544696.jpg
この場合、配線の通りトップのMODE signal=CH1だけ。緑に反転しているPULSE freq(周波数)=1000hz(1kHz)になっている。あとCH1 volts/div=2.0 に調整済み。
ジャンパ線だと校正する必要もないが、市販のプローブだとSETTING当たりをいじるのかな?今回はちょっとだけ見てみた。

結局6本の線が出るか、市販のプローブ3本(GND付き)になる。普通の線と「ICクリップ」というのを買うと安くあがる。
a0034780_11021535.jpg
これなら押すと先をから導線が出るのでワニ口クリップより、繊細にはさめるのでいい。

【ICクリップによるプローブ】
a0034780_11415407.png
それぞれ必要に応じて結線する。最初はCH1とGNDの2本だけで十分かな?PUSLE出力もほぼ使わないのではずす。
そしてICクリップをそれぞれを回路に当てて計測する。

P.S.
GNDは同じだから1本でいいのかな?2CH以上でオシロスコープを使った事がないから理解してない。他の使い方があるのかもしれないが、そうすると4本でいいのかな。市販のプローブの3本に近くて助かる。

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

arduinoによるオシロスコープ (4/12)

九州工業大学のarduino を使ったオシロスコープ Kyutech Arduino Scope を作ってみた。
arduino Uno互換の「びんぼうでいいの」に数個の部品をブレッドボードに組んでATmega328にスケッチを書込み、arduinoとPC上のProcessingのプログラムがシリアル通信して動作する。
以前扱った記事の「ハンディ・オシロスコープ」とは違い、PCのマイク端子ではなくarduinoが電圧をサンプリングし、PC側のGUIの単位も実際のオシロスコープの様なus/divとなっていたり、操作パネルも position / variable、TRIG mode : auto / normal / single などとなっている。

実際のオシロスコープに近いと操作方法もネットから探しやすい。そして直接PCにつないでいないので、回路間違いでショートしたりしてもダメージがPCに行かない。これは初心者の私でも壊すまで行かなくてもなんとなく安心だ。どちらかというとUSB端子が抜き差しでグラグラしてきている方がダメージ大きいが。
サイト様の回路図はシンプルすぎて、どの端子がプローブに当たるのかよくわからなかった。一か八かでCH1とGNDをプローブの+、-として、PWMで明滅する別のarduinoスケッチfadeのLEDの+(長い足の方)、-(短い足の方)につないでみたら、波形が表示された。

そしてそれだけでは単にノイズのような細かすぎる塗りつぶされたような波形なので、色々といじってみたら、ちゃんと矩形波の周期が長くなったり短くなったりする様子が見れるようになった。

「ハンディ・オシロスコープ」とは操作方法も見方も違うな。あちらはWindowsの使い勝手を理解した作りで、スライドバーやドロップダウンやスクロールバーで使いやすくできており、こちらは実際のオシロスコープのようにボタンやロータリーエンコーダーのようなダイヤルではないが、単位を合わせており、わかっている人にはわかりやすい作りになっている。実際のオシロスコープを利用する際には役に立つ。USBオシロスコープなどのPCで測定画面を表示するものには「ハンディ・オシロスコープ」に近い操作性のものもあるが。

そしてトリガー入力やPULSE出力という「ハンディ・オシロスコープ」ではなかった端子があり、実際のオシロスコープにはある使い方のわからない端子のようだ。うーん、ちょっともう少しオシロスコープの機能を調べないとまだまだ使えないな。敷居は高いが本格的に高度な使い方を覚えるにはこのオシロスコープは入門用にちょうどいいステップかもしれないな。そして次の段階に上がるには秋月で売ってる2400円のやつかな?

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

Japanino ArduinoISPで ATtiny13 の ATtiny85 への置換方針 (3/28)

(2017/4/8 追記)
海外のサイト様にきれいな表がある。
ATtiny13 vs ATtiny85 - avrProgrammers
a0034780_15152927.jpg
結構まとまっているようで、AVRの各種プログラムライターの回路やよく出てくるノウハウ的回路が、綺麗な写真とともに載っている。
How-To Articles - avrProgrammers
a0034780_15271040.jpg
(ここまで)

AVR 8Pin DIP の ATtiny13とATtiny85の互換性(差異)だが、

メインの違いはRAM容量で、ATtiny13 = 1KB , ATtiny25/45/85 = 2/4/8KB 。
ではATtiny*5はATtiny13の完全上位互換かというと、そうではない。

技術者あるあるで、まず短所から。

(1) ATtiny10/11/12/13/14/15の系列
(2) ATtiny15/25/45/85の系列
1の拡張は機能メイン、2は容量メイン。

つまり、ATtiny XY のXは容量(KB)、Yは機能の互換性を示しているので、
ATtiny13とATtiny85は機能の拡張+容量の拡張になる。

ただし、内・外部クロック周波数は、ATtiny*5がサポートする周波数でのみ互換性があるので、それ以外の設定では同じクロック数にならない。

また機能追加のせいで低電力動作時の消費電力が20%大きい(240→300μA)。

細かいが、AVRの新しいチップには内蔵RCのジッタ(波形のくっきり度)が大きくなる傾向があるので、より高精度に使うには外部クロックの使用推奨度も大きくなる。

ここまで。

ここからは長所。

互換性については、外部ピンレベルではハード的に上位互換性があるので、内蔵RCや外部クロックで同じにすれば、あとはピン機能とFuse設定の変更だけで、プログラムのソフト互換は保たれる(命令数123でアセンブラレベルで同じ)。HEXしかなくても、AVRはわかりやすいので書き換えは可能。ソースがあればコンパイル時にピン機能を置換するだけ。ピン機能も基本的なものは同じ。

なのでチップ置き換え可能性は高い。

ここまで。

ピン機能で大きな違いとしてタイマ1と、USIというUSARTの下位シリアル機能が追加されている。

円高で古いATtiny13の方が極端に安い間は、単機能を実験するのに気軽に買えばいいし、もし価格差が縮まったり、容量や追加機能が必要になったらATtiny*5を買えばいい。

AVRはPICよりもチップごとのピン機能やハードの互換性が高く、周辺機能が基本的なものに抑えられているおかげで、ディスコンになっても置き換えがしやすい構造となっている。そうやってPICのような地位に登り詰めるまで広く技術ノウハウを貯めていく方策だったのだろう。そしてそれはarduinoでの採用により成功した。合併してもディスコンに強いというメリットがなくなるからPICとの混合はしないだろう。そしてメーカーとしては製造設備投資などコストアップにつながるので、ディスコンできるチップは魅力的。新しいチップに投資が出来るなら将来性をAVRにかけて、カスタマイズ性をPICに与えていくのだろう。

ARMのドタバタが続くなら、このまま8ビットの緩やかなコスパ良好(上昇)路線でベースを整え、32ビットでパワーを出していく(32ビットも互換性重視で)、ノウハウを貯める感じかな。うまく舵取り出来れば将来性とコスパの魅力で利点を大きく伸ばしつつ、主戦場のマイコン32ビットで主権を握っていくのだろう。
[PR]
by k1segawa | 2017-03-28 17:21 | arduino, AVR | Comments(0)

Japanino ArduinoISPで ATtiny13 で BASCOM-AVR (39) (3/17)

またシリアル通信は確かにアセンブラで制御すれば収まるかもしれないが、ワンチップマイコンの使い方でも、本当に中のハードの仕組みまで抑えないと出来ない。

シリアル通信自体、規格に沿って使うだけだったので、細かい通信のインプリメントをハードレベルで実現したいとは考えていない。ハードの汎用ロジックICのデジタル電子回路の習得までと決めてあったのに、小さいもの好きが高じて8Pin1KBのATtiny13にこだわり過ぎた。
同じことをするなら、ATtiny85でシリアル通信をソフトシリアルで受信バッファを持たせた物に置換する。そしてATtiny13には簡単な制御だけにし、PCへの1個のセンサーデータ取り込みをシリアルで行うためにはATtiny85とする。
そしてMatrix 8x8 LEDで無理に汎用ロジックICを使うのではなくどうしても使いたい場合に使う。
だから8Pinは実験のためであり、安く単純に使うためBASCOM-AVRやArduinoを使う。
複数センサー入力するなら8Pinにこだわらないし、容量も1KBにこだわらない。
そしてそれは実験ではなく実用にしたいのだから、少し高くてもきちんとしたものにして、流用を考えない。だからブレッドボードではなく基板で、50円マイコンじゃなくてもいい。それが8KB越えするならArduinoでもよい。

アセンブラもそうなると全体を作成するのではなくサイズ縮小ではなく、高速化のためとなる。
ならばAVRではなくARMにすればいい。がワンチップマイコンでARMが使えるのかわからない。
AVRならば大容量多ピン種でも8ビット/32ビットともにArduinoのブートローダを書き込めばソフトはまあまあ一律で同じのが使えるが、高速化も極めるとつらいのでARMとなる。

個人レベルで高速化が必要なものって高速な通信プロトコルのためか、液晶コントロールぐらいか。でもそれってグラフィック転送レベルだよな。なら液晶モジュール(キット)でいいんじゃない?

やはり個人ならARMの力は不要で、ソフト一律のArduinoが使えるAVRで十分だ。まあロボットを作りたいなら反応速度を上げるのにセンサーデータを解析するホストマイコンかRaspiへ通信速度が高速な必要もあるかも。ただローカルで脊髄反射のようにするならホストはいらず、AVRローカルで制御できるかな?

あと流行りの画像・音声認識や人工知能・自動運転の末端センサーなら、大容量高速通信が必要かな。ここにはARMの独壇場となりそう。

あくまでも「個人の趣味レベルの場合」で書いたが、PICはハード屋さんなら究極にコストパフォーマンス高くできるので、そういう人はPICでがりがり書けばいい。それを目指してもいいが、ハードは奥が深すぎてちゃんと勉強して専門の電気の知識を頭に入れないと難しい。

せいぜいワンチップマイコンの制御レベルでも本当に極めれば難しいので、そこはArduinoのライブラリにおんぶにだっことする。

通信とかね。

はー、回り道した。ここでいったん仕切り直しとする。これもポケコンでやった事を振り返って初心に戻ったから、ハマっていた事に気が付いた。周りを見直すのは大切だ~
[PR]
by k1segawa | 2017-03-17 14:07 | arduino, AVR | Comments(0)