ラベル PIC の投稿を表示しています。 すべての投稿を表示
ラベル PIC の投稿を表示しています。 すべての投稿を表示

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関数が正しく働かないので、実測値でパラメータを設定しました。

 

 

 




2011年3月21日月曜日

arduino400を再設計してみる

PIC18F14K50(DIP) + Atmega328p(DIP)
PIC18F14K50(SOP) + Atmega328p(DIP)
MCP2200(SOP) + Atmega328p(DIP)
で使えるようにしてみた。

DIPとSOP両対応のため凄い配置になってしまいました。
八潮秋月でRGB LED(GB-339RPGBC)が10円だったので、これを使えるように変更するか思案中

50mm x 50mmの基板10枚を$12で作成できるところを見つけたのでそこに頼む予定


2011年3月9日水曜日

PIC18F14K50でCDC-ADC

たまにはソフトよりのことも書いてみます。
ADCの内容をCDCに書き出すJalV2コードです。
初めてJalV2で書いたプログラムなので自信ないですけど、間違ってたら添削お願いします。

シリアルに対して0-7を送るとADCの値を返すだけの簡単なプログラムになってます。
対応表は下記の通り
0 -> AN4
1 -> AN5
2 -> AN6
3 -> AN7
4 -> AN8
5 -> AN9
6 -> AN10
7 -> AN11
8 -> テスト文字列

動作回路とブートローダは
http://hp.vector.co.jp/authors/VA000177/html/pic18boot.html
を想定しているのでORGは0x800からになってます。
Bootボタンを押すとpicbootのモードへ移行します。

USBリセットはこれでOKなのかな?

2011年1月31日月曜日

arduino400の基板を作成

気を良くしてarduino400の基板を作成しました。
昨年末Fusion PCBで50mm x 50mmサイズを発注。
初めてEagleCADで作ったりました。抵抗、コンデンサはすべて表面実装
秋月のAE-ATMEGAが出るのを知ってれば自分で作らなかったでしょう(涙)。
  • arduino互換
  • Metaboard互換
  • PIC18F14K50のUSBデバイス(pic18spxとして動作可能)

ピンフレームはarduinoの配置にしてあります。

再度作りなおすなら

  • USB Miniコネクタにする
  • atmega8u2 + atmega328 SMD版を使ってUno互換にする
  • 裏にatmega1284 SMD版のパターンも入れる
  • xBeeのパターンも追加する
  • 3.3vレギュレータのパターン
この基板(+チップ部品)をirukaさんに差し上げたいがどうしたものか...
arduino400互換

普通に作るとこんな感じ
撮影用として大きい3225サイズのチップ抵抗を使いました。ランドを大きめに作ってるので簡単にはんだ付けできます。
右下に 赤外線受信モジュール(PL-IRM0101)を配置してます。
SIIのボルテージディテクタS-8053HNBをリセットICとして使う贅沢な設計


Metaboard互換

Metaboard互換(裏面)

入手性の悪そうな部品(ツェナーダイオード)パターンはアキシャルリードも使えるようにしてます。

ソケットの間にクリスタルを配置
秋月八潮で買った2色LED 300円/200個を使ってる。単色2本でも使えるようにカソードの穴は2つある。
作りかけ(裏面)

リビングで使ってるやつ

arduino400 + USB IR Toyしてみました

irukaさんのarduino400を再度作りました。
picはcdcとhidキーボードとして切り替え可能にしました。
arduinoの結果をシリアルで受け取りキーボードのイベントに変換するようにプログラムしました。

かわいそうにMPUが抜かれてます

リモコン受信モジュールはSHARP GP1UD282XKです。秋月八潮店特価50円/2個でした。
200円で手に入れたHP社のリモコン

リモコンフォーマットはRC5でした。

appleのリモコンも対応可能に

appleのリモコンフォーマットはNECでした。

arduino400

次に作ったのがirukaさんのarduino400
pic18f14k50(200円) + atmega328(250円)でarduino互換機が作れるというすばらしいコンセプト!!
この時点ではまだarduinoに興味は無かったんですけど、作ってみて使わないと判らないことがあるんですね。

MPUをはずされたarduino400

サンハヤトのICB-86G基板で作りました。
picのcdcはWin7(64bit)でも快適に動いてarduino環境を学ぶことができました。
ここからarduinoへ傾倒していきます。

USB Infrared toyもどき

pic18fの書き込み環境を手に入れて次に作ったのがUSB Infrared toyです。
「パソコンに不慣れな妻のため」という理由をつけて例のごとく買わずに作ったのがこれです。
これでリビングのパソコンもリモコンで快適に使える???

USB IR Toyもどき

PIC18F2550をサンハヤトのICB-87に配置しました。ブートローダはirukaさんのものを少し改造して使いました。

pic18spx

次に興味を持ったのがUSBをネイティブに使えるマイコン。
attiny2313 + 100円でUSBネイティブなマイコンPIC18F14K50が買える。
でも、PICのライターが無いので...

hidaspxでお世話になったirukaさんがまたもや解決策を与えてくれました。
それがpic18spxです。

pic18spx

C基板でpic18spxを作成
C基板の角を少し切ると68円ショップケースに丁度収まります。
基板が広いので3.3v、5v切り替えになってます。