日曜日, 5月 29, 2016

Arduino as ISP: ATtiny13A ヒューズ・リセッター

ATtiny13A というマイクロコントローラICがあります。

このたびこいつを Arduino でどうにかプログラミングすることができたので経緯を記しておきます。すったもんだしたあげくいろいろなものを壊した気がします。というのは、ヒューズの設定で動いてくれなかったからです。

わかってみるとなんですが、この入手したチップ、内部クロック用ヒューズが工場出荷時の値(0x6a, 0xff)ではなかったわけなんです(データシート)。これが原因だと分かるまで時間がかかりました。まずは表面実装部品を使ったのが苦労の発端。

使い慣れない部品を使って新しいことをやろうというのは不確定要素が重なって原因への追及への困難が増します。気を付けましょう。SOP8変換ボードが悪いのか、はたまた設定のせいなのか、そもそも不可能を試みているのかわからないからです。

自作のヒューズ・リセッタ


結論をいうと、Arduino IDE 1.6.x で ATtiny13A をプログラムすることができました。ただし、ヒューズのリセッタを作成する必要がありました。以下のサイトを参照させていただきました。

Arduino UNOでATTiny開発してるときに書き込めない!AVR壊れた!?その前に
Attiny13をArduino化 ついでに外部クロック
AVRマイコンを Arduino-IDE 1.6.x で使用する方法

リセットされれば標準的な?やり方でプログラムできます。

まず File | Examples | 11. ArduinoISP メニューから ArduinoISP をアップロードします。ロード出来たらライタ・シールドを接続し、ATtiny をセットします。青いLED が点滅すれば準備ができています。Tools|Board を ATtiny13 、Tools|Programmer を Arduino as ISP を設定します。そしてプログラムをアップロード。


Attiny 自作ライタ・シールド

ATtiny13A でフルカラーLEDを動かしてみました。


月曜日, 5月 23, 2016

Arduino: チップ部品を使う・時計を動かす

挑戦してみました。表面実装(チップ部品)。安い、小さい、軽い、将来性ってことで、使えなきゃいけないとは思ってはいたのですが、変換ボードさえあればブレッドボードで動きます。


まずは変換ボード。これがないと始まらない、というか部品が宝の持ち腐れとなってしまいます。この変換ボードが今日やっと届きました。待ち遠しかったですね。


こいつの作り方のコツはきっちり手順を踏むことですね。手順を踏まないといろいろ壊れます。まずピン足への線が細かくて切れます。パターンが熱で外れます。ブリッジができます。なんかいくつも壊した気がします。

以下手順です。

ブレッドボードを利用してピン足をはんだ付けする。これで固定できます。はんだをチップ部品のパターンへ薄く流す。チップをピンセットでつかみ、薄くついたはんだを溶かしながらチップを固定する。

薄くはんだを置いて部品を固定し、ブリッジができないよう各ICピンをはんだ付けしていくわけです。ここは細かい作業なので神経を使います。導通チェックでよくよく見ていくとつながってなかったなんてことがあるわけですね。接続はきちんと調べましょう。

このSOP8のICは時計用のICで、時計用のクリスタルを接続すると時計として使えます。プロトコルが特殊ですが、Arduino 本家のサイトのコードを使うと時間をきちんと読み込んでくれました。

これでチップ部品が使えます。

土曜日, 5月 21, 2016

(Arduino): ESP8266 を USB シリアル通信変換器 FTDI でつなぐ

WiFi モジュール ESP8266 というのがあります。無線LANとつなげるというのがウリですが、Arduino との連携がよくない。ともかく USB シリアル通信変換器 FTDI で PC とつないでみました。


ESP8266 のピン配置は以下の通り。

Rx Vcc
GPIO Reset
CPIO CH_PD
GND Tx

あとは FTDI と WiFiモジュールをつなぎます。





長足のピンヘッダーを使うとうまくブレッドボードを使えます。

Vcc, GND
Rx - Tx
Tx - Rx
pull-up CH_PD

PC とつなぐにはまず FTDI のドライバをダウンロードします。

 
あとこれ引っかかりやすいですが、デバイスマネジャーで通信速度を設定します。

Arduino IDE を立ち上げて、ポートを設定、シリアルモニターを起動して通信速度を設定し、モジュールをつなぎます。

AT とコマンドを打つと OK と返ってくるはずです。
 

画像は AT+GMR コマンドの結果を示しています。

水曜日, 5月 18, 2016

Arduino: シリアル通信(IIS)

Arduino Uno はそこそこピン数があります。7セグでもつなげてしまうほどピン数が多いわけですが、線の多いのは困りものです。場所を取るし配線がやっかいです。配線が多いのはうざいってだけではなく、配線を調べねばならないというだけで作ろうという雰囲気をぶち壊してくれます。

そこでシリアル通信なる方法を使います。効率よくデータを送受信できます。Arduino 用モジュールとして売られているセンサーなどはそもそもシリアル通信でのみ通信できるようなものも多いです。

先日頼んでおいた加速度センサーでシリアル通信(IIC)を使ってデータを読み込んでみました。Arduino 標準の Wire.h ライブラリを使ってアドレスを指定し、データを読み込みます。配線は Vcc (5V), GND, SDA (Pin 4), SCL (Pin 5), CS (5V)。


アドレス、モード指定、レジスタ番地などはデータシートなどを参照する必要があります。ここで引っかかったのはモード指定で、データシートを見ても指定しなければならないということがなかなか読めない。

書き込みは多いモジュールなので、どうやら動くよう設定することができました。以下コードです。

#include <Wire.h>
#define addr 0x53
void setup()
{
Serial.begin(9600);
Wire.begin();
Wire.beginTransmission(addr);
Wire.write(0xA7);
Wire.endTransmission();
Wire.beginTransmission(addr);
Wire.write(0x2D);
Wire.write(0x0);
Wire.endTransmission();
Wire.beginTransmission(addr);
Wire.write(0x2D);
Wire.write(0x10);
Wire.endTransmission();
Wire.beginTransmission(addr);
Wire.write(0x2D);
Wire.write(0x8);
Wire.endTransmission();
}
void loop()
{
int x,y,z;
Wire.beginTransmission(addr);
Wire.write(0x32);
Wire.endTransmission();
Wire.requestFrom(addr,6);
if(6<=Wire.available())
{
x=Wire.read() << 8;
x|=Wire.read();
y=Wire.read() << 8;
y|=Wire.read();
z=Wire.read() << 8;
z|=Wire.read();
}
Serial.print("X =");
Serial.println(x);
Serial.print("Y =");
Serial.println(y);
Serial.print("Z =");
Serial.println(z);
Serial.println();
delay(500);
}

日曜日, 5月 15, 2016

Arduino: 7セグ時計

有機ELディスプレイってのはいいです。小さいのがいい。薄くて軽くて電池の持ちがいい。バックライトのいらない発光素子ってのはいいです。暗闇でも見えるし、それでいて消費電力が少ない。

しかしながらまだ高いのが難点です。そこで価格の安い7セグを使ってみました。7セグなら暗闇でもくっきりはっきりそれなりの雰囲気があります。


ここでは4桁の7セグを直接 Arduino とつないでみました。各セグメントへ7+1ピン、各桁へピンが4つ、あとは GND をつなぎます。注意せねばならないのは、この7セグはカソードコモンなのでドライバ用のトランジスタがGND側で必要だということです。

あとはパターンをセグメントへ送ればいいわけですが、各桁ごとパターンを消去、そしてパターンを送るというプロセスを繰り返します。書き込んで間をおかないとうまく表示されません。

空いているピンでクロック・モジュールを読み込んでいます。

まずはブレッドボードで組んでみたのですが配線が多い。のでモジュールを作ってみました。

digitalWrite() を使ってひとつひとつ書いていくと画面がちらつくので、ポートレジスタへ直接データを書き込んでみました。



コードはこちらです。

/*
* Clock.cpp
*
* Created: 2016-06-21
* Author : easai
*/
#include <DS3231.h>
//DS3231 rtc(SDA, SCL);
DS3231 rtc(SCL, SDA);
Time t;
int seven_segment[] = {
0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x0
};
int dot = 0b10000000;
int digit[] = {
0b00000010, 0b00000100, 0b00001000, 0b00010000
};
int pause = 4;
void setup() {
DDRD = 0b11111111;
PORTD = 0;
DDRB = 0b00011110;
PORTB = 0;
rtc.begin();
}
void loop() {
t = rtc.getTime();
PORTD = seven_segment[t.min % 10];
PORTB = digit[3];
delay(pause);
PORTD = seven_segment[(t.min / 10) % 10];
PORTB = digit[2];
delay(pause);
PORTD = seven_segment[t.hour % 10];
PORTB = digit[1];
delay(pause);
if (10 <= t.hour)
{
PORTD = seven_segment[(t.hour / 10) % 10];
PORTB = digit[0];
delay(pause);
}
PORTD |= dot;
}
view raw Clock.ino hosted with ❤ by GitHub

Qt: 外部プログラムを起動する

  Qt/C++ のアプリは、外部へ直接アクセスできます。これはネットアプリでは不可能な Qt のメリットです。 外部プログラムを起動することもできます。QProcess::startDetached() を使うと独立したプロセスを立ち上げることができます。 この QProces...