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

2016年5月2日月曜日

さぁ大型連休の中間点だ(imodela+eagleで基板切削)

GWの前半を使って、Amisの基板を切削した。
今度は、elecrowとかに発注してみたいけど、複数作るものではないので、切削で十分。

部品をハンダ付けするだけなので、作業自体は相当短縮できる。
ただし、GNDベタパターンなので、サーマルランドにしたとしても、容量の大きいハンダゴテが必要になった。


ユニバーサル基板の試作とはまた違った趣があって、いいですな。
まだ、光センサーの接続が残っているけど、まずはこんな感じで。
あとは、適当なケースに入れて、外部入力を接続すれば、最初の目的は達成できそう。
http://continue-to-challenge.blogspot.jp/2016/02/amis.html
これの赤外線出力以外を実現。

まだまだやりたいことがたくさんあるけど、GW中に完成できるかな・・・。

2014年12月13日土曜日

iModela+eagleでプリント基板作成(動作確認)

ようやく、パターンのチェックが終わり想定外のショート・断線が無いことを確認した。
すぐにでも電源を入れてみたかったけど、
肝心のソフトウェアがまだ・・・。

この基板に載っているのはPIC16F818で、I2Cのスレーブにもなれる。
これをラズベリーパイから操作したいと思っている。
その前段階として、PIC自身がカウントアップするプログラムを書いて、
動作確認を行うことにした。

やはり、Linux(X86_64)環境では開発環境が遅すぎるので、
32bit環境で開発を行った。

/* 
 * File:   main.c
 * Author: adeno
 *
 * Created on 2014/12/13
 */

#include 
#include 
#include 
#include "nana_seg_ptn.h"

/*
 * 
 */
// CONFIG
#pragma config FOSC = INTOSCIO  // Oscillator Selection bits (INTRC oscillator; port I/O function on both RA6/OSC2/CLKO pin and RA7/OSC1/CLKI pin)
#pragma config WDTE = OFF       // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON       // RA5/MCLR/VPP Pin Function Select bit (RA5/MCLR/VPP pin function is MCLR)
#pragma config BOREN = ON       // Brown-out Reset Enable bit (BOR enabled)
#pragma config LVP = ON         // Low-Voltage Programming Enable bit (RB3/PGM pin has PGM function, Low-Voltage Programming enabled)
#pragma config CPD = OFF        // Data EE Memory Code Protection bit (Code protection off)
#pragma config WRT = OFF        // Flash Program Memory Write Enable bits (Write protection off)
#pragma config CCPMX = RB2      // CCP1 Pin Selection bit (CCP1 function on RB2)
#pragma config CP = OFF         // Flash Program Memory Code Protection bit (Code protection off)

#define _XTAL_FREQ 4000000      //delay用に必要(クロック4MHzを指定)
#define TMR0_CNT 0        //TMR0カウント値設定

static void seg_sel(unsigned char n);

unsigned char keta; //7segの桁
unsigned int num;
unsigned char gcnt;
/*
 *
 */
int main(int argc, char** argv) {

    OSCCON = 0b01100010;
    //PORTA 3-0は7segのd-a 不論理
    //RA4は1桁目、RA6は2桁目 不論理
    //PORTB 3-0は7segのh-e 不論理
    
    //PORTA 0,1,2,3,4,6,7
    //PORTB 0,2,6,7 桁 5
    PORTA = 0b11011111; //PORTAの中身をきれいにする
    TRISA = 0b00000000; //PORTAは 1:入力 0:出力

    PORTB = 0b11100101; //PORTBの中身をきれいにする
    TRISB = 0b00000000; //PORTBは 1:入力 0:出力

    keta = 0;
    num = 0;
    gcnt = 0;

    //TMR0の割り込み初期設定
    //1000ms=0.25us(4MHz)*4*プリスケーラ−256*256
    OPTION_REG = 0b0111; //プリスケーラ値設定0b0111(=256回)
    TMR0 = TMR0_CNT; //TMR0カウント値設定

    INTCONbits.TMR0IE =1; //タイマ割込み許可
    INTCONbits.GIE = 1; //全体割込み許可

    unsigned char ra_bak;

    while(1) {
        //表示を消す
        seg_sel(0);
        //PORTA = 0b01011111;
        __delay_ms(1);

        //表示
        seg_sel(keta);
        //PORTA = 0b01001001;
        //PORTB = 0b00001111;
        //NOP();
        //RA4 = 0;
        __delay_ms(3);
        //桁移動
        keta++;
        if(keta > 5){keta = 1;}



    }


    return (EXIT_SUCCESS);
}


static void interrupt isr(void) { //割り込み関数
    if(INTCONbits.TMR0IF == 1) {  //割込み種がTimer0割込みの場合
        INTCONbits.TMR0IF = 0; //Timer0割り込みフラグクリアー
        TMR0 = TMR0_CNT; //TMR0カウント値設定
        gcnt++;
        if(gcnt > 5){//15){
            num++;
            if(num > 9999){num = 0;}
            gcnt = 0;
        }
    }
}
// =============== セグメントセレクタ    ============
static void seg_sel(unsigned char n){
    //PORTA 0,1,2,3,4,6,7
    //PORTB 0,2,6,7 桁 5

    unsigned char ptn,ra_bak,rb_bak;
    ra_bak = PORTA & 0b00100000;
    rb_bak = PORTB & 0b00011010;

    switch(n){
        default:{ }
        case 0: {
            //初期化
            PORTA = 0b11011111;
            PORTB = 0b11100101;
            break;
        }
        case 1:{
            //セグメント1
            ptn = show_number(num % 10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b01100101; //7
            }else{
                PORTB = 0b01000101; //5to7
            }
            
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //NOP();
            //PORTA = 0b01000000 | (0b00001111 & ptn);    //RA4をL + ptn
            PORTA = ra_bak | (0b11011111 & ptn);
            //PORTA = 0b11000000;
            break;
        }
        case 2:{
            //セグメント2
            ptn = show_number((num / 10)%10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b10100101; //6
            }else{
                PORTB = 0b10000101; //5to6
            }
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //PORTB = 0b11000001; //5と2
            //NOP();
            //PORTA = 0b00010000 | (0b00001111 & ptn);    //RA6をL + ptn
            //PORTA = 0b01000000;
            PORTA = ra_bak | (0b11011111 & ptn);
            break;
        }
        case 3:{
            //セグメント3
            ptn = show_number((num / 100)%10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b11100001; //2
            }else{
                PORTB = 0b11000001; //5to2
            }
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //PORTB = 0b11000001; //5と2
            //NOP();
            //PORTA = 0b00010000 | (0b00001111 & ptn);    //RA6をL + ptn
            //PORTA = 0b01000000;
            PORTA = ra_bak | (0b11011111 & ptn);
            break;
        }
        case 4:{
            //セグメント4
            ptn = show_number((num / 1000)%10,0);
            if((ptn & 0b00100000) > 0 ){
                PORTB = 0b11100100; //0
            }else{
                PORTB = 0b11000100; //5to0
            }
            //PORTB = rb_bak | (0b00001111 & (ptn >> 4));
            //PORTA = 0b01010000 | (0b00001111 & ptn);    //ptn
            //PORTB = 0b11000001; //5と2
            //NOP();
            //PORTA = 0b00010000 | (0b00001111 & ptn);    //RA6をL + ptn
            //PORTA = 0b01000000;
            PORTA = ra_bak | (0b11011111 & ptn);
            break;
        }
    }

}

/*
 * File:   nana_seg_pth.c
 * Author: adeno
 *
 * Created on 2014/11/13
 */

#include "nana_seg_ptn.h"


// =============== 表示パターン ====================
unsigned char show_number(unsigned char n,unsigned char dot){
    static unsigned char ptn = 0b11111111;
    /*
     * 76543210
     * hecagfbd
     */
    switch(n){
        case 0: { //abcdef
            ptn = 0b10001000;
            break;
        }
        case 1: { //bc
            ptn = 0b11011101;
            break;
        }
        case 2: { //abdeg
            ptn = 0b10100100;
            break;
        }
        case 3: { //abcdg
            ptn = 0b11000100;
            break;
        }//hecagfbd
        case 4: { //bcfg
            ptn = 0b11010001;
            break;
        }
        case 5: { //acdfg
            ptn = 0b11000010;
            break;
        }
        case 6: { //acdefg
            ptn = 0b10000010;
            break;
        }
        case 7: { //abc
            ptn = 0b11001101;
            break;
        }
        case 8: { //abcdefg
            ptn = 0b10000000;
            break;
        }
        case 9: { //abcdfg
            ptn = 0b11000000;
            break;
        }
    }

    return ptn;
}

<次回改善>
・数値→7セグパターン出力は汎用的に使えるようにしておく
 今は配線の都合だけでレイアウトしてしまったので、
  RA: 76543210
     7seg:hecagfbd
 みたいなことになっている。。。
 パターンを作る人と出力のために変換する人が必要。

動作確認結果がこちら。
スモーク色のアクリル板を上に載っけておくと表示が見やすい
(というか、板が無いととても見づらい。。。)
カメラで撮るとチラツキが目立つね。



次はI2Cの確認だ−!

2014年12月7日日曜日

iModela+eagleでプリント基板作成(部品実装完了)

朝、会社に行く前とか、帰ってきてからの少しの時間で、少しづつ部品の載せてきた。
今日ようやく完了した。

実装してきて思ったことは、
・銅箔面を素手で触るとすぐに変色してしまう→要手袋
・作業が中断する場合は、密封して極力外気に触れさせない→チャック付きの袋

右側切るの忘れてた・・・。
まだ通電確認していないけど、
 裏側はこんな感じ
き、汚いOrz

次作るときは、
・GNDは熱が逃げやすいので、工夫が必要
・ジャンパーは直線がいい、極力少なくしたい
・チップ部品は意外と楽ちん (今回は1か所しか使っていないけど)
・GND以外の島は削っておきたい:加工時間が長くなってしまうけど、
  はんだが移っちゃうし・・・。

コーティングスプレーしたからもう机上に置きっぱなしで大丈夫なはず・。


2014年11月29日土曜日

iModela+eagleでプリント基板作成(2/2)

前回の続き

ガーバーデータの出力は、いろいろなところで紹介されているので、
キーワードだけ。
gerb274x.cam → パターンデータ
excellon.cam   → ドリルデータ

らしい

生成したガーバーデータを「WINSTAR PCB for iModela」にて読み込む。
切削に使うエンドミルが一覧に無いので、「詳細設定」を選ぶ。
このあたりは、トライアンドエラーで行き着いた値なので、正しくは無いかもしれない。。。
でも大丈夫そうだから、まぁいいか。

「了解」を押すと「切削設定」が表示される
パターン:0.3mm
ドリル穴、カット:0.5mm
剥離面:0.5mm
芯ブレ補正値:0.04mm






「V」をクリック「Vカッター計算」というのが開く

このあたりの数値もトライアンドエラー、でも動くからこれでいいやOrz

もろもろ確認して、OKであれば切削を開始する。
 また「Vカッター計算」
切削速度は10mm/s程度までなら大丈夫みたい。



うりゃー
ガーガーうるせーーー
パターンの切り出しに20分くらい
穴あけに15分くらい

 ところどころ削りきれていないものがあるので、
カッターで微修正。
 今日はここまで。
久しぶりにやったので、一日がかりだ。やれやれ。
でも達成感があるね。

iModela+eagleでプリント基板作成(1/2)

ユニバーサル基板では大変だけど、基板を発注するほど大量には作らない時、
自分でプリント基板を作りたい衝動に駆られた。

感光基板をエッチング液でうんたらかんたらは、
綺麗に作れるのだけど、廃液の処理とか感光時間の 調整とか
ドリルで穴あけとか、ちょっと心が折れたので、
もう少し楽ができないかなと思った。
(もう1年以上前の話だけど。。)

その時に衝動買いしたのが、iModelaである。
http://icreate.rolanddg.com/iModela/DGJ/Japanese/index.html/

iModelaは非金属の加工ができる個人向けの切削加工マシーンなのだけど、
エンドミルをつければ、プリント基板を加工できるのだ。
http://www.pcbmilling.biz/

なかなか値が張るのだけど、いろいろできそうと心が踊り、
衝動買いしたのはもうかなり前。

しばらく厳重に保管しすぎてホコリがかぶっていたが、
これではいけないと思い、再び始めたのである。

前に作ったときは、FT232RLのSSOPのピッチまで作れたので、
今回のデザインルールもコレと同じでクリアランス0.35mmとした。

eagleでデザインルールを指定
チェックすると大量のNG項目がでて、作り直し。。。


その後、
太さを変えるのを忘れていた。
電源は16mil、信号線は12milとした。
直角曲がりは気持ち悪いので、変更した。
GNDのベタパターンを作成し、最終的にはこうなった。

まずはここまで。