2013年4月25日木曜日

PIC12F1822(jalv2)でNikon ML-L3互換リモコン


Nikonのデジカメ用リモコンML-L3の互換機をPIC12F1822で作ります。
ML-L3に解析データは先人の知恵を参考にさせて頂いてます。



PIC12F1822は今回初めて使う石ですが、JalV2でサポートされているので安心。

完成品

完成品

コードの説明

delay

m秒単位の_usec_delay(2_000)だと時間が安定してなくて、delayライブラリのdelay_1ms(2)を使いました。

定数判定の最適化

JalV2は定数の分岐は最適化されてコンパイル時にコード生成するのでクロック指定の部分でも
case target_clock of 32_000_000: block pragma
pragma target PLLEN P4 OSCCON_SPLLEN = 1
OSCCON_IRCF = 0b1110 -- 32MHz = 8Mhz * 4
OSCCON_SCS = 0
end block
16_000_000: OSCCON_IRCF = 0b1111 -- 16MHz
8_000_000: OSCCON_IRCF = 0b1110 -- 8MHz
4_000_000: OSCCON_IRCF = 0b1101 -- 4MHz
2_000_000: OSCCON_IRCF = 0b1100 -- 2MHz
1_000_000: OSCCON_IRCF = 0b1011 -- 1MHz
500_000: OSCCON_IRCF = 0b1010 -- 500kHz HF
250_000: OSCCON_IRCF = 0b1001 -- 250kHz HF
125_000: OSCCON_IRCF = 0b1000 -- 125kHz HF
otherwise OSCCON_IRCF = 0b1101 -- 4MHz
end case
実際には

;   56   16_000_000: OSCCON_IRCF = 0b1111              -- 16MHz
                               movlw    135
                               andwf    v_osccon,w
                               iorlw    120
                               movwf    v_osccon

の部分だけコードになってます。
c言語だとプリプロセッサ命令(#IF)使う部分をJalV2は普通に記述できるんです。
凄いですね。


部品

PIC12F1822 80円/1個
2N7002k 200円/40個
赤外線LED 100円/10個
CR2032 100円/2個
CR2032電池ホルダー 35円/1個
Frisk基板 100円/2枚
Frisk空き箱
抵抗20Ω 100円/100本

SMD部品を先にはんだ付け
 
 


コード

-- ------------------------------------------------------
-- Title: Nikon ML-L3 IR Wireless Remote Control of the Microchip pic12f1822
--
-- Author: Masahiko KANETAKA, Copyright (c) 2013, all rights reserved.
-- http://kane4d.blogspot.jp/
-- kane4d at gmail.com
--
-- Adapted-by:
--
-- Compiler: 2.4p
--
-- Description:
-- Nikon ML-L3 IR Wireless Remote Control for Microchip PIC12f1822.
--
-- Sources:
--
-- Notes:
--  - File creation date/time: 13 Apr 2013 14:11:50.
--
-- ------------------------------------------------------
--
include 12f1822                    -- target PICmicro
--      Vdd 1--+---+--8 Vss
-- CCP1/RA5 2--|   |--7 RA0/ICSPDAT
-- CLKo/RA4 3--|   |--6 RA1/ICSPCLK
-- MCLR/RA3 4--+---+--5 RA2/CCP1
--
-- #1 Vdd
-- #3 CLOCK Out
-- #5 PWM LED Drive
-- #8 Vss

-- include 16f1823
--      Vdd 1--+---+--14 Vss
--      RA5 2--|   |--13 RA0/ICSPDAT
--      RA4 3--|   |--12 RA1/ICSPCLK
-- MCLR/RA3 4--|   |--11 RA2
--      RC5 5--|   |--10 RC0
--      RC4 6--|   |--9  RC1
--      RC3 7--+---+--8  RC2


-- This program assumes that a 4 MHz Internal OSC
pragma target clock 16_000_000     -- oscillator frequency
pragma target PLLEN P1
pragma target OSC      INTOSC_NOCLKOUT     -- INTOSC
OSCCON_SPLLEN = 0
OSCCON_SCS = 0b10
case target_clock of
  32_000_000: block
              pragma target PLLEN P4
              OSCCON_SPLLEN = 1
              OSCCON_IRCF = 0b1110              -- 32MHz = 8Mhz * 4
              OSCCON_SCS = 0
              end block
  16_000_000: OSCCON_IRCF = 0b1111              -- 16MHz
  8_000_000:  OSCCON_IRCF = 0b1110              -- 8MHz
  4_000_000:  OSCCON_IRCF = 0b1101              -- 4MHz
  2_000_000:  OSCCON_IRCF = 0b1100              -- 2MHz
  1_000_000:  OSCCON_IRCF = 0b1011              -- 1MHz
  500_000:    OSCCON_IRCF = 0b1010              -- 500kHz HF
  250_000:    OSCCON_IRCF = 0b1001              -- 250kHz HF
  125_000:    OSCCON_IRCF = 0b1000              -- 125kHz HF
  otherwise   OSCCON_IRCF = 0b1101              -- 4MHz
end case

-- configuration memory settings (fuses)
pragma target WDT      disabled     -- no watchdog
pragma target DEBUG    disabled     -- no debugging
pragma target LVP      disabled     -- no Low Voltage Programming
pragma target MCLR     internal     -- reset internally
pragma target CLKOUTEN disabled     --enabled

include pwm_hardware
include delay

enable_digital_io()                -- make all pins digital I/O
--

alias clkout_test_pin is pin_CLKOUT --RA4
pin_CLKOUT_direction = output

if (true) then
   pin_CCP1_RA2_direction = output
   APFCON_CCP1SEL = 0 --RA2
else
   pin_CCP1_RA5_direction = output
   APFCON_CCP1SEL = 1 --RA5
end if

-- pwm_max_resolution(1)
pwm_set_frequency(38_400)     -- 38.4KHz
pwm1_set_dutycycle_percent(0)

-- http://www002.upp.so-net.ne.jp/hard-and-soft/IR_Remocon/IR_Remocon.html
-- http://www.sbprojects.com/projects/nikon/index.php
--     high      low     high      low     high    low     high
--  +--------+         +-------+        +-------+        +-------+
--  |        | 28000us |       | 1580us |       | 3580us |       | 63000us
----+ 2000us +---------+ 400us +--------+ 400us +--------+ 400us +---------+

_usec_delay(2_000)
pwm1_set_dutycycle_percent(50)
for 2 loop
--forever loop
   pwm1_on()
   --_usec_delay(2_000)
   delay_1ms(2)
   pwm1_off()
   --_usec_delay(28_000)
   delay_1ms(28)
   pwm1_on()
   --_usec_delay(400)
   delay_10us(40)
   pwm1_off()
   --_usec_delay(1_580)
   delay_10us(158)
   pwm1_on()
   --_usec_delay(400)
   delay_10us(40)
   pwm1_off()
   --_usec_delay(3_580)
   delay_1ms(3)
   delay_10us(58)
   pwm1_on()
   --_usec_delay(400)
   delay_10us(40)
   pwm1_off()
   --_usec_delay(63_000)
   delay_1ms(63)
end loop

pwm1_off()
asm sleep
--

JalV2のソースとHEX

 

OSC16MHzはPWM38.4Hzを発生できるクロックなら変更可能だと思う。
 
2013/5/5 OSC1MHzに変更 1MHzだとdelay関数が正しく働かないので、実測値でパラメータを設定しました。

 

 

 




2013年4月16日火曜日

atmega328pコンポーネントテスター3号機

調子に乗って3号機を作成。
arduinoのシールドとして動作し、LCDやボタンを省きシリアル出力に特化したバージョンです。

arduinoを持っていれば200円くらいの部品代で作れます。

ケース加工中
基板をけちってジャンパーで渡しました。

表から
カーボン抵抗5%なので、将来変更できるようにセパレート構造になってます。
裏から
プルアップ抵抗は10kΩ~30kΩなら何でもOK

リセットの回路図
次はPC側の読み込みソフト編


2013年4月11日木曜日

atmega328pコンポーネントテスター2号機

1号機を作る最終段階で発見したのが、シリアル出力機能。
PC3からソフトシリアル9600bpsで液晶画面と同じものが出力されます。

1号機は金属皮膜抵抗1%を使いましたが、今回はカーボン抵抗5%を使います。
お小遣いを握りしめ先週末に秋月に金属皮膜抵抗1% 680Ωと470kΩを買いに行きましたが、なんと470kΩは取り扱いが無いのです。行き場を失ったお小遣いは「お楽しみ袋」に化けてしまいました。
夢の0.1%の抵抗はお父さんのお小遣いでは高くて使えません。

秋月のarduino互換機AE-Atmegaの拡張基板として、両面C基板を使いました。
部品配置
arduinoのジャンパーを引き出して利用しました。

  • RxをPC3へ
  • RSTをPD7へ(DTR on/offでテストボタンを動作させるという目論見)

電源回路はarduino側にすべてあるので、C基板の半分しか使ってません。
一応、LCDを付けて動作テストもしてみました。
LCDの動作テスト

今回はバックライトを380kΩで駆動。
ファームを書き込みの際にFUSE設定するのを忘れ、スロー動作で値も変な状態になってしまいました。いきなりシリアルでテストしていたら、動作速度がおかしいことに気付かなかったでしょう。
atmega328pのFUSEはF7/D9/FCです。

atmega328p 16MHzの設定でコンパイルしたHEXはこちら


arduinoはピン番号が揃ってるから接続も簡単でした。
teratermで試したところ、受信動作はOK
PC側からの測定開始にはteratermのマクロでsetdtrコマンドを使いました。
でも、残念なことにDTR on/offで測定する目論見は失敗でした。
PD7がLOWになっている時間が短いのが問題かも...

次号機はAE-Atmega上で直接構築してみます。

2013/4/11 23:00
この回路図の更新したものがあるのですが、画像サーバとの連携エラーで画像を変更できない状態です。

2013/4/12 8:00
RST<->PD7間にS-8053HNBを入れたらsetdtrで計測開始出来ました。なぜかエラーで画像更新できない。




S-8053HNB
以前、千石通商のジャンクパーツ袋に入っていたSIIのボルテージディテクタS-8053HNB
3VでOpenDrainに落ちる。

DTR->0.1μ 水色、PD7 黄色
Pin1 Out(Drain) PD7
Pin2 Vdd DTR->0.1μF
Pin3 Vss GND
に接続




80ms間PD7がLOWになって、めでたく自動測定開始されました。
このチップの検出限界になると、Outが閉じる性質を利用してます。


  1. コンデンサに充電
  2. コンデンサが放電
  3. 3V以下になるとPD7 LOW
  4. さらにコンデンサが放電
  5. まだ、PD7 LOWのまま
  6. 検出限界まで来るとOutが閉じてPD7 HIGHになる


atmega328pでコンポーネントテスター


aitendoのatmega8基板
もちろんatmega328pでも使える

1年くらい前にavrで作成されたトランジスタテスターが紹介されていた。
その頃は、ドイツ語のサイトで???で、回路図もソースも読まずに時が流れて...

ジャンクパーツの手助けになれば ということでLCメータを作ったりしましたが、秋月の「お楽しみ袋」のパーツの量が尋常ではなく、ここで重たい腰を上げねばと一念発起。
avr transistor testerについて調べてみると超シンプルな設計思想に驚き、日本語でも情報発信されているnobuさんのページを参考に1号機を作成。

以前作ったaitendoのマイコンPCB[PCB-ATMEGA8]+atmega328p(16MHz)をベースとして作成しました。
基本の回路図では8MHz駆動になっていたのですが、ソースを読むと16MHzも考量されているようだったので見切り発車状態でいざはんだ付け。

部品配置
緑C基板の下にatmega328pの基板がいます。
作ってから気付いたのは基板の半分が1.5V→5Vの昇圧回路になってます。なんでも作ってみないと分からないことがあります。
今、新規に作るのであれば006P 9Vにスーパー3端子レギュレータ 5V500mA R-78E5.0-0.5を使います。
ケース加工が苦手です
Makefileの

PARTNO = m168
→PARTNO = m328p

OP_MHZ = 8
→OP_MHZ = 16
2か所変更だけで動作しました。


カッコ悪いけど、3個100円のタッパに入れて1号機完成。
端子の順番が2-1-3となってカッコ悪です。
PEAKの半導体アナライザみたいにテストクリップの色で表現しようかなぁ。

調子に乗って2号機も作ってます。

変換基板で3.3Vレギュレータ

デジカメを新調した記念にブログ更新。
以前、秋月のSOT23変換基板を使った小物なんてものを作りましたが、その続編。
ジャンクで手に入れたBH33MA3WHFV-TR 低損失ポイントレギュレーター 3.3V300mAがたくさんあるので、これを使って小物電子工作。

6ピン0.5mmピッチの極小です。
これを秋月の0.5mmピッチIC変換基板(5枚入)にのせてみました。最近の秋月の変換基板には裏にもチップを載せることができるので、これを最大限に生かした配置にしました。
変換基板にはサーマルビアが無いので、放熱は???です。
2年前の死蔵ペースト半田をコテライザーミニのホットブローで炙って出来上がり。
変換基板が8ピンなのでGNDをジャンパー大移動して4ピンSIPに仕上がりました。

久しぶりに更新

デジカメが手元にないと更新が億劫になってしまい、何も更新もせず日々が過ぎて行きました。
先月、型落ちのデジカメ(CASIO EX-ZR300)を新調するも、3日目でレンズエラーで販売店へ。
同じ機種交換を所望したが、在庫なしで返品になってしまった。
あーー腰砕けの日々...