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年10月16日日曜日

エナメル塗料でアクリジョンは溶けないのか?

しばらくアクリジョンを使って塗装しています。
使い終わった塗料皿なんかを、バケツに入れておけば、簡単に掃除ができるので重宝してます。
当然無臭ですし。

さて、アクリジョンの上にエナメル塗料でスミイレやらウェザリングやらするわけですが、どういうことか、一度、アクリジョンが溶ける、というか、塗膜がぼろぼろはがれてきたことがあります。アクリジョンのつや消しの上に、タミヤエナメルでウォッシングしてる最中の時でした。
アクリジョンの説明によれば、乾燥したアクリジョンの上にエナメルを塗っても大丈夫なはずですが、なぜか溶けました。
すこし調べると、エアブラシ専用薄め液だと落ちる、というような話もあり、、、

ということで、実験してみました。

テストピースにエアブラシ専用薄め液で薄めたニュートラルグレイ(左)と、アクリジョン薄め液で薄めたニュートラルグレイ(右)を塗ります。乾燥は3日ほど。



まずは、何もつけない綿棒でこすってみます。
(10秒くらいかなり強くこすりました)


ちょっとだけ落ちました。強くこすってるので力ではげた?

次にエナメル溶剤をしみこませた綿棒でこすります。

塗料が落ちました・・・
両方とも落ちていますので、エアブラシ溶剤だから、ということもなさそうです。

いちおう水を含ませた綿棒でも試してみました。
もちろん、ほとんど落ちません。先の何も浸みさせていない綿棒と同じようです
テストピースの塗料がはげているのは、上の、エナメル溶剤でこすったピースを流用しているから。



ということで、アクリジョンも、多少はエナメル溶剤で溶けるようです。今回は強くこすっていますので、スミイレ程度なら、エナメルでもいけると思います。
ウォッシングも、さっと拭く程度ならいけるかもしれません。
ウォッシングならMr.ウェザリングカラーを最近試していますが、油彩ベースだから?アクリジョンの上でも大丈夫そうです。













2016年7月3日日曜日

アクリジョンでスミイレしてみた

アクリジョンを試しています。
ラッカーのあの臭いがないのが、本当に快適です。

ついでにエナメルも置き換えられないかなーと思い、スミイレしてみたのですが、こちらはダメでしたね、、、

エアブラシ用アクリジョン専用うすめ液で薄めることで、流し込むことは出来ました。
が、その後の拭き取りがうまくいきません・・・

乾かないうちに水で拭き取ろうとしても、やっぱり拭き取れない(固まってしまった)部分が残ります。
そうすると、ツールクリーナーの出番になるのですが、そうすると、きれいに拭き取れない。
細かい塗料カスがぼろぼろでるんです、、、ツールクリーナーは溶かすわけではないので。

うまい方法があればいいんですが。いまのところエナメル使う感じかなと。
ちなみに水で薄めた場合は、塗料が流れません。
水自体が、モールドに流れていかないのがその理由です。
水だけ流し込んでも、流れないんですよ。