ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示
ラベル 電子工作 の投稿を表示しています。 すべての投稿を表示

2017年12月3日日曜日

Use Arduino IRRemote library on ATTiny85

--- 日本語は下の方に記載してあります

Arduino IRRemote library supports ATTiny85. ( Official homepageand Github)
But it does not work so far on my environment. To use it for sending IR, some tricks are needed.

  1. Stop interrupt during sending IR.
  2. Modify delay function, IRsend::custom_delay_usec
Background of this modification is simple. IRRemote library uses TIMER0 to control PWM for IR on ATTiny. Arduino time related functions, like micros(), uses TIMER0 for counting time. IRRemote's changing TIMER0 parameters changes its behavior.
And TIMER0 generates interrupt every overflow period to count up arduino timer related values. By IRRemote's change, TIMER0 trigger's overflow interrupt each 13usec period (at CPU clock 8MHz). This breaks PWM frequency since PWM works with TIMER0, too.

So, solution for 1 is that use noInterrupts() and interrupts() before/after IRsend::sendXX();

noInterrupts();
irsend.sendRaw(codeValue, 32);
interrupts();


Solution for 2 is that replace custom_delay_usec()'s wait function to use delayMicroseconds(). delayMicroseconds() does not uses timer interrupts related value to wait. See API reference.

void IRsend::custom_delay_usec(unsigned long uSecs) {
  delayMicrosec(uSecs);
}

I did above two in my sketch by copying IRsend code from IRRemote library code...
It can be achieved by inheriting own class from IRsend, but not tested.

===
ATTiny85でArduinoのIRRemote libraryを使う方法です。
IRRemoteはATTiny85のサポートをしていますが、いくつか修正をしてあげないと動きません。

  1. 赤外線を送信している間、割り込みを禁止する
  2. IRsendのcustom_delay_usec()の修正

--- Follows are japanese.---

IRRemote libraryは、ATTiny85の場合、TIMER0を利用して赤外線送信を行っています。しかし、TIMER0はArduinoのタイマー周り、例えばmicros()の実現のために利用されています。
IRRemote libraryは、赤外線の38KHz, 1/3 dutyを実現するために、PWMを利用しており、ATTiny85の時は、TIMER0で、このPWMを制御しています。
IRRemote libraryが赤外線のためにこのTIMER0を変更しますが、このせいでmicros()あたりの挙動が変わります。
IRsend::custom_delay_usec()はmicros()を利用しているため、期待したwait時間のwaitをしません。
また、この変更による割り込みも影響します。
Arduinoの時間系ライブラリは、TIMER0のOverflow割り込みを使って時間関係の変数を更新します。IRRemoteは、TIMER0のoverflow valueを変えるため、13usecごとに割り込みが発生します。(CPU clock 8MHzのとき)
このoverflowが起きると、割り込みが終わるまでpwmの動作も止まってしまいます。38KHz, 1/3 dutyが壊れるわけです。

1の対処は簡単です。Arduinoの割り込み禁止・許可関数の、noInterrutps()/interrupts()を、IRsend::sendXXの前後で呼び出すだけです。
2の対処ですが、IRRemote libの、custom_delay_usec()の処理を、delayMicroseconds()に置き換えるだけです。delayMicroseconds()は、TIMER0割り込みを使わないように書かれていますので、TIMER0の影響を受けません。
(コードは上の方に)

私の場合、IRRemote libから、sendXX関連のメソッドを自分のsketchにコピーして書き換えました。元のコードをいじらないためです。
IRsend classを継承して、必要なメソッドをoverrideすることでも実現できるはずですが、未確認です。

2016年7月3日日曜日

attinyの電源をUSBからとる:パスコンの利用

写真とかないですが、メモ程度に。

Attiny13aをブレットボード上で開発してました。
ソフトの書き込みもあるので、そのときはArduinoの5Vを引っ張ってきていました。

これを同じ5VのUSBから引っ張ってきたところ、なぜか稼働せず。
プログラムが途中で止まったり、そもそも全然違う動きをしていたり、、、

これが必要だったようです。
Wikipedia:バイパスコンデンサ

マイコンやらLEDの動作で、電源電圧が落ちていたと。
バイパスコンデンサとして、10uFのコンデンサをつけたところ、正しく動作しました。

回路図などの説明は検索するといろいろ出てきます。
たとえばこちら

マイコンとかですと、0.1uF〜0.01uFのセラミックコンデンサが一般的なようです。
この値については、ここが参考になりそうです。

電子工作する人には当たり前の知識なんだと思いますが、私のような素人には知らないことばかりです。

2016年6月12日日曜日

Arduino UNOをISPにして、ATTiny13へ書き込み

Arduino UNO経由で、Arduino IDEで書いたコードを、ATtiny13に書き込みを行える環境を作りました。

hardware/下を作るのに手間取ったというか、なんで動くようになったのかよくわからないので、
とりあえず丸ごとgithubに保存してます。
https://github.com/nackon/arduino_attiny13
この環境の既知の問題として、delayで指定した時間が正しくない、というのがあります。
(追記)
Bootloaderの書き込みがうまくてきてませんでした。
次の記事に追記します

参考にしたサイト
https://arduinodiy.wordpress.com/2015/04/26/installing-attiny13-core-files-in-arduino-ide-1-6-x-and-1-7-x/
→これをちゃんとやったつもりだったが、なぜか動かない・・・
http://www.instructables.com/id/Installing-Attiny13-core-files/
→boards.txtをこれに従って直してみたら・・・動いた。

接続方法はこちら。
http://make.kosakalab.com/make/electronic-work/arduino-ide-arduinoisp/
http://www.jonki.net/entry/20131109/1383977233

Arduino UNOの人は、10μFのコンデンサーが必要です。
https://www.arduino.cc/en/Tutorial/ArduinoISP
1KΩとか250Ωの抵抗で代替できる、とか言う記述も見かけましたが、
私はダメでした。

2014年11月15日土曜日

Raspberry Pi 購入:Raspbian インストール

いきなりですが、Raspberry Piを初めて見ます。
電子工作したくなったのも一つであり、また、いろいろあるセンサーをいじりたくなったのも一つ。
最大の理由はハルロックに刺激された、というところwww
ま、刺激されたのはおいといて、やはり前者です。スマートフォンで、ソフトウェア(アプリ)開発および公開のハードルはかなり下がりましたが、やはりハードが必要になる部分はどうしようもないです。(そこをソフトやクラウドで何とかすることを考えるのも、アイディアの源泉かもしれませんが)

ということで、ハードもいじりたいなと、思った次第です。
ソフトウェアと同じく、ハードウェア作成のハードルもかなり下がっています。
ブレットボードを使えば、半田付けすら不要ですからね・・・作ったハードを量産してくれる工場もたくさんあるみたいですし。

ということで、まずは機材の用意。



Raspberry Pi Model B+ と、ケースのセット。
やはりパーツむき出しは不安なので(MacbookProのアルミの上に置いたらショート・・・)、ケース付きにしました。
B+にしたのは、まずは遊んでみるため、かつ、プロトタイピングでハードを試作するとき、USB端子の不足はどうにも解消できないから。
完成後、端子多すぎて(サイズ的に)常用できないときは、新しいの買えばいいですしね。




お勉強用に。



Raspberry Piはストレージを持たないので。4GB〜8GB でいいらしいですが、大して値段も変わらないので16GBを選択。32だとさすがに無駄かな・・・



GPIOをブレットボード化してくれます。すぐには使わないけど、将来的に便利そうなので。
あとは、HDMIケーブルと、USBキーボード、マウス、MicroUSBケーブルを用意しました。
HDMIケーブルやらキーボードやらは、将来的にSSH接続で開発できる環境にすればいらないのですが、やっぱり最初は必要になりました。はじめは手軽にRaspbian NOOBSで始めたのですが、その際はこれらが必要になります。
すぐにケーブルレス開発も出来そうですが、いきなりハードルをあげる必要もないでしょう。あとでじっくり対応していけばいいだけです。

ということで、準備が出来たらとりあえずインストール・・・ですが、難しいことはありません。
NOOBSのセットアップガイドに従って、インストールしていくだけです。
英語ですが、諦めないでください。中学レベルの英語です。全然難しいことは書いてません。
要約すると:
  1. NOOBSのアーカイブをダウンロード
  2. アーカイブを展開し、展開されたファイルをSDカードにコピー
  3. SDカードをRaspberry Piにさす。
  4. USBキーボード・マウス・HDMIケーブル(To TV or Monitor)をRaspberry Piにさす
  5. MicroUSBをさし、電源供給
  6. インストーラーが起動し、インストールされます。
  7. 最初に何をインストールするか聞かれますが、一番上のものを選べばいいです。Scratchは初心者用の開発環境みたいなので、必要に応じて選べばいいです。Scratchとはなにか?・・・ググってください。
  8. 後は勝手にインストールされます。

OK押すと再起動されます。Linuxでよく見る起動メッセージが表示され、しばらく見ていると・・・Configuration menu(raspi-config)がでてきます。



なにもいじらなくていいと思います。
4.Internationalisation settings で、日本語化も出来そうですが、Linux Destributionでは日本語にしてろくなことがないので、私は英語で使います。

<Finish>を選択すると、コマンドラインが出てきますので、startxと打ち込んでリターン



きました!デスクトップ環境!!



無事ここまで来ました。ネットワークの設定してないし、出来ることを調べてもいないので(- - ;、今日はここまでです。
電子工作目的ですが、まずはネットワークの設定をしてしまいたいので、別で記事を書く(かも)。