暇つぶしにもってこい!
2016.1.9~2016.1.11
初めてのPICで初めてのサーボモータを動かしてみるテスト
ブレッドボードも初めてなので真ん中からラインが分断されてるとは気が付かず
電源は左端、モータは右端なんて事でやってたもんだから、そんだけで半日過ぎましたよ(www
サーボモータを動かしてみた動画サーボはRB303(上側)とE-MAX ES08AII(下側)です。
シンクロバッチリ(意味あるのか。。。)
ソースはNone氏のHPにあったものを無断でごにょごにょやりました。
Pic12F683 サーボモータのASMソースをお借りしましたです。
最初はcのサンプルをお借りして確認してたんですが、なんかぁ一か所追加しただけで動かなくなるの。。。ぐすん。どおしてぇ???
んで、仕方ないからアセンブラの方で確認すると、こちらはバッチリです。
が、が、が、が、どうも様子が変!!!
まぁ、最初はES08Aだけでテストしてたんですが、ご覧の通りで何が悪いのやらサパーリわからんですた。...orz
サーボに変なパルス送って壊したかと思ったんで、別のサーボを買ったという。。。
で、2つ同時に動かしてみたらば、、、結果はますます混迷深まるばかり。。。うわーーーーん(泣
原因は電圧不足でした。
なんで気づいたんだ>俺
とりあえず、配線はメチャクチャなんで、良い子は絶対マネしないでね。
2016.01.14
MPLABのcコンパイラが、どうにもこうにもならないです。何か追加や変更かけるとPWMがサッパリなのでmikroCに変えてみました。 こちらは期待通り動いたです。
回路図はいつか書けるかしら。。。
何付けてんだかさっぱりなんで。
2016.01.17
PIC12F683で浅草ギ研の近接スイッチを読んでみるテスト
PICのソースは
例によってあの方の。。。(ぉ PIC奮闘記
4入力 => PC出力 電圧測定器(12F683)をお借りしました。
今回入力は一つなのと送信時間を短くしただけです。
PC側のプログラムはc#でつくりました。
2016.01.21
PIC12f683でLチカ
なんの変哲もないただのLED点滅プログラム。
のはずなのに、出力が0に向かうと二度と点灯しなくなる。。。謎?
しかし或る時青のLEDがグリーンに変わる。え???
あ、これマイコン内蔵のLEDですた。。。orz
んで、ただのLEDにしたらば、、、
きちんと動くじゃないか、バカヤロー>俺
2016.01.24
mikroCコンパイラーに疑心暗鬼
void main()はあきらかに存在するのにmainが無いというエラーが出て結局プロジェクトを作り直す。
原因不明mainが無いというプロジェクト
エディタ上には存在しない変数でエラーが出てコンパイルが失敗する。
コピペに日本語があったのがまずかったようだ
単にLEDを点滅させるだけなのに点きっぱなしで点滅しない。。。
コンフィグレーションに誤りがあるのだろう。。。
ブレッドボードをテーブルから持ち上げると動き出す。
たぶん静電気
いろいろライブラリがあるのはいいんだけど、返値の範囲、同様に渡す値の範囲が書かれていない。
タブオーダーは無視されるし、時々カーソルが消えるし、エディターが糞レベル。こんなんでコンパイル通してまともな
バイナリが生成されるとはとうてい思えない。
こんなエディタ作ったやしは、もし自分がそこの社長なら即、首にしたいレベル
picコンパイラのアニマス版と言ってもいいだろう。しかも、どのコンパイラも似たり寄ったり。
まだスッキリしないが。。。
さて、今回は以前作ったmikroCのPWMでサーボモータを動かすテストのボリューム部分を
浅草ギ研の近接スイッチで代用してみたテストです。
DOUNLOAD: テストムービー
DOWNLOAD: プロジェクト
プロジェクトはmikroC PRO for PIC v.6.6.2用です。(win7(32))
プログラムソースは"pic12f683pwm_1.c"にあります。
バイナリは"pic12f683pwm_1.hex"です。
質問されても自分もわからない事だらけですがやってる事は4つだけです。
int conv(int n)
ret=28*n/1024;//パラメータは0~1023ですが、分解能が28だという事です。
でもってCCPR1Lに渡せる値の範囲が10~38としています。
これはサーボモータの仕様によって変わるはずです。
その範囲を超えるとサーボが死にます。(ウソです)自分のテストではギィーギィー言うだけで
壊れていないように見えます。たぶん大丈夫でしょう。責任取りませんが。(ぉ
main()
この中のANSEL=0x04;でコメントがGP3/AN3->Set analog type"というのは合っているのか疑問です
GP3に何もつないでないすから。。。
TRISIOもありますね。
赤ちょうちん行きたくなりますね。
Init_CCP()
PWMのためのレジスタ設定ですね。
最初PWM1_Init()とかmikroCのライブラリを使ってましたが、さっぱり動かなかったのでこうなりました。
たぶんこれもコンフィグの設定ミスなんでしょうけれど。。。ライブラリのサンプルもあるんです
あるんですが、違うPicのサンプル見せられても、あまり参考にならないんです。
int adconv()
ここは手を入れてあります。
delay_us(25);直下のwhile(1)ループは以前は
while(ADCON0.F1);で無限ループでした。
これだと、一瞬PWMが止まる時があります。
PWMでONになるLEDが消灯するので、PWMも落ちているはずです。
で、まあdelay_us(25)を入れてリトライするようにしました。
これだとLEDは消灯しません。
まぁ、そんなこんなで一日が過ぎたとさ。。。
2016.01.25
キッ
キッ
キッ
キ
キターーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー!!!
RS232cの通信プログラムが動いたーーー@mikroC Pro for PIC
そうか、やっばりコンフィグのアレだ。
MCLR Pin Function
Enabled コレをDisabledにする。する。しないとダメ。絶対!
何故mikRocではデフォルトイネーブルなのか。開発者が普段そうなんだろうか。。。
おまいの開発環境とか周りのやしがどうだか知らん。でも、PICのデフォルトはDisabledだ。市ね!(ぉぃ
4番ピンはマスタークリア(MCLR)と呼ばれているピンで、普段は電源に繋げておき、 リセットをかけたくなったら0Vにします。
当然つなげてないという事で、しょっぱなからリセットしまっくてたと。。。
今まで動かず溜め込んだプログラムを見るとみんなこれ。。。orz
理由が判って良かった。あやうくPICを1ポンドハンマーで叩き割る処だった。
2016.01.28
PIC12F683のメモリサイズが非常に少なく感じた日
普段windowsでプログラムしているせいかストラクチャメンバに何かを作ってそれを配列でなんて事を
考えてしまったのだが、PIC12F683の汎用RAMは128bytesしかなかった。つまりコンパイルエラーになってしまい
先に進まなくなった。
たとえばアナログデータの収集を100回やってソートして中央値にあるIDとその値を得るなんて事は不可能だ。
他の部分のデータも考えると10回でも危ない気がする。
なにしろ128バイトである。日本語なんてものは使わないが(使えるはずもない)2バイト文字なら64文字で限界なわけです。
nano-simが2005年時点で128Mバイト、pc8001でさえ1979年で16KB。
1983年に発売されたファミコンでさえ2KBもあるのになんとチープなメモリサイズ。オモチャにしかならない。
なんというか半導体メモリの世界は進歩が著しいので、PIC12F683を見たときにメモリサイズなんてものは自分が使う程度の範囲なら
楽勝だろうと思っていたのだけれど。
これは使い処を考えないといけませんね。まぁ、今のところ使う予定もないのですが。。。(ぉぃ
こんな小さなボディの8pinPICがいろいろな事が出来るのに凄く感激して好きになってしまったのに
なんでこんなにRAMの容量が少ないのか。。。
あれこれできて器量が良いのに、ついさっきの事を覚えていないボケのようなものだ。
非常に残念であるが、仕様だ。仕方ない。これは現実なのだ。130円のマイコンに贅沢を言うのも無理がある。
そうか安いのだから大量に使えば良いのか。。。200固ぐらい。。。いや、やめとこう。連携を取るのが無理っぽい。
実はRS232cで送受信やってて、232cならやっぱり割込み受信でしょと。
ところがmikroCのSoft_UART_xxが割込みに対応していないんです。
受信だけ割込みであとはメインで送信しようと思ったんですが
reentrancy is not allowedなんてエラーが出てコンパイル停止になる。
だから、んじゃ、全部割り込み中にやったら?って思ったんだけど、無理っぽい
下のソースはハングります。
/*------------------------------------------------*/ /*電文受信した後LoopBackするかもしれない.cのソース*/ /*mikroC PRO for PIC only */ /*------------------------------------------------*/ char g_error; char g_nRcvEnd=0; char g_byRcvbuff[32]; //割込み中なのに、のんきにこんな処理やってるとハングりますよ旦那! //韓国じゃないです、ハングるですよハングる。えっ同じ? void WarikomiCyunoSousin(){ char i; GPIO.F0=1;//LED点灯for(i=0;i < g_nRcvEnd;++i){
Soft_UART_Write(g_byRcvbuff[i]);//割込み中に使っちゃダメな関数 } //ダメ!絶対ダメ。いや~んダメダメダメ! g_nRcvEnd=0; GPIO.F0=0;//LED消灯 } //割込み処理 //とにかく最短で抜けるべし。 //後でもできる事はmainに戻ってからやる。 void interrupt() { char byRc=0; INTCON.GIE=0; //割込全体禁止 if(INTCON.GPIF) { //受信割込か? INTCON.GPIF=0; //GPIO割込フラグクリア INTCON.GPIE=0; //GPIO割込無効 byRc=Soft_UART_Read(&g_error);//割込み中に使っちゃダメな関数使ってます。 //↑これ、なんか、呼んだ後GPIO割込が入ってません? INTCON.GPIF=0;//なので、GPIO割込フラグクリア。しないと再割込みしますよ。たぶん。 g_byRcvbuff[g_nRcvEnd++]=byRc;//受信データセーブ(容量32bytes)。 if(0x0a == byRc){//とりあえずLFを終端記号としています WarikomiCyunoSousin(); } INTCON.GPIF=0;//もう一度やります INTCON.GPIE=1; //GPIO割込復帰 } INTCON.GIE=1; //割込全体許可復帰 } void main(){ short i; char error; g_nRcvEnd=0; CMCON0 = 0b00000111; OSCCON = 0b01110000; OPTION_REG = 0b10000111; ANSEL = 0; // Configure AN pins as digital I/O TRISIO = 0b00001010; //GP1,GP3を1:入力に、他を0:出力に設定 IOC=0b00000010; //IOC1; //RX(GP1)変化チェック割り込み有効 INTCON.GPIF=0;//GPIO割込フラグクリア INTCON.GPIE=1;//GPIO割込有効 INTCON.GIE=1;//割込全体を許可 Delay_ms(200); //rx:1=GP1 tx:2=GP2 error = Soft_UART_Init(&GPIO, 1, 2, 9600, 0); if (error > 0) { GPIO.F0=1; //Error LED ON while(1) ; // Stop program } while(1) { // Endless loop GPIO.F5=1; Delay_ms(100); GPIO.F5=0; Delay_ms(100); } } /*********************************************************************************************/ 前提として、立て続けに二回送ってはいけない。ので受信後にPICとしてはackかnakを送るべきですね。 最長電文サイズがなんと6バイト。5かも。それ以上送るとPICが異常事態になります。 で、まあ、実用には無理っぽい。 どうしよう。。。やめよか。。。
2016.01.31
下の記事を読む前に
単体でのリセットにはウォッチドッグタイマを使うのが基本らしいです。(激汗
知らずにやっちまったというか。。。まぁ、いっか。
WDTを使うと単体でリセットできます。で、そのプロジェクトも下のDOWNLOADに入れてあります。
お、おねげいしますだ、お代官様あぁぁ、、、昨日の事はどうかお許しをををを。(げしっっっ、ぐさっ
2016.01.30
結局、異常データが来ない保証は無いので、何かで止まるとそれっきりなわけです。
なので、内部からプログラムリセットしようと思ったんですが、やり方が見つかりません。
外部からのスイッチか、電源ON/OFF。。。困ったなと思っていたら、MCLRがありましたね。
最初はこれで散々な目に遭いましたが本来つなげておくべきものかも知れません。
で、もう一つのPIC12F683を使ってリセットする方法を考えてみました。
まぁ、安い石なんで幾つか買っといたんです。
DOWNLOAD: テストムービー
概要
左PICの通信プログラムはMCLRピンをイネーブルにしてコンパイルします。MCLRピンは右PICのGPIO.F5へ。
左PICで通信エラーが発生(他のエラーでも可)した場合、GPIO.F4を1にします。このピンは右PICのGPIO.F0へ。
右PICは立ち上がったらGPIO.F5を1にしておき、GPIO.F0を監視。今回1秒間隔でチェックしました。
で、GPIO.F0が1になったらGPIO.F5を一旦0にして200msec後1にします。
これで左PICはリセットがかかりすぐに再起動。再び通信可能になります。
電文サイズは5バイト超えると受信エラーになってしまい2度と通信できません。
メインにも戻りません。内部からリセットできれば問題ないのですが。。。どなたか知っていたら教えてください。(ぉ
とりあえず電文はSTX(0x02)'99'ETX(0x03)というパターンでPICとPC間は通信。これだと問題は出ません。
でも、電源投入直後とかバッファオーバーランとか何があるかわからないので、そのためのエラー処理は必要です。
もちろん入れてません。(ぉぃ
※暫くしたらプロジェクトをUPします。
右PICがハングした時の事を考えてもう一つPICを用意して監視用PICは相互にヘルスチェックさせると完璧かもしれません。
安いんだから一杯使いましょう(w
今回使ったmikroCとvc2010のプロジェクトです。
WDTでリセットするプログラム>Rs232c_RW(WDT)
Resetterが必要なプログラム>Rs232c_RW(MCLR)
DOWNLOAD:プロジェクト
2016.02.14
寂しいですうぅぅぅ(泣
バレンタインデーに一人でこんな事をやってるとは。。。
まぁ良い。今日は初めてそれっぽい物を作ったのだ。
裏は見せられない(笑
赤外線は目視だと見えないがカメラにはハッキリ写ってますね。近距離センサの目が。
なんか可愛いです。
DOWNLOAD:PIC12f683とPC(windows7+vc2010(c#))のプロジェクト
お決まりの、このプログラムを使った結果の責任は一切関知致しません。質問やボケ、突っ込みはbbsへどぞ。暇があれば返信いたします。
概要
PC側 PICへ ENQ(0x05)を送信
PIC側 ENQを受けたら ADCON(GPIO.F4)の値を10ビットで取り出しバッファ2、3バイト目にHI,LOの値をそのまま入れてPCへ送信。
データフォーマットは STX(0x02),HI,LO,ETX(0x03)
PC側はPICからのデータを受信したらプロット。
以上です。
2016.03.06
今回はムービーだけです。
ステッピングモーター17PM-K044。電源は9V2Aです。
PIC12f683で回しております~
モータードライバはTA7291Pを2個。
最初はTB6674PGを使ってましたが、回らなくて、
コレ、電圧が6V必要らしいんですが、PIC用の5V電源が6V近く流れるんで動くかなと思ってたんですが動かなくて
あれこれやってるうちに気が付いたらモーター側の9Vを流してオシャカにしましたな。。。orz
ムービーは。。。意味あるのか。。。まぁ、備忘録的にup
DOWNLOAD:脱調すると振動がでます。
Project(miKrocPro V6.2.2):project Download
2016.04.04
カメラ用の小型ステッピングモータをPICで回す。
その一 PIC18F242
モータ用電源は9v2Aを秋月で売ってた定電流源IC,NSI50350AST3G(350mA)
を入れて動かしてますが、200mA~300mA程度で良さげ。(電流大杉のようです。
A4998のパチもんなのか(並行輸入とかって。。。)
扱いがデリケートです。
ハンダとか無理。
なんつーか接着がシリコンボンドっぽいのだ
※当然簡単にピンが抜ける(オシャカですよ?アニキ!!!)
下のムービーはボリュームがデカいので注意してね。(up後に判明)
movie:pic18f242+A4988
movie:pic12f683+A4988
2016.04.07
小火木
PICのサンプルを掲示してくれているサイトは有用で有難いんですが、なんというか。。。読んでるうちに、それいつの?と
思う時が良くある。というか有り過ぎます。どういう訳なんだろうか。。。まぁ、まるっきり参考にならない訳じゃないし。
気にし過ぎか。3年以上前になるともう既に。。。半年以内であってもバージョンがあがってまるっきり違うパターンもあるんで
アテにならない事もあるわけです。バグだらけだったライブラリに使えないという判を押すのは構わないけど2、3年前の話なら
今は正常な事もある訳で。まあ、じゃあやってみるかと、やってみたらやっぱり動かないとか悲しすぎるんだけど、使い方に
問題があるかもだし。。。悩むんですよ。
SEO | [PR] !uO z[y[WJ Cu | ||