2016年6月28日火曜日

Pawtrackみたいなもの作るための部品サイズについて

ネコをGPSで追いかけるPawtrack面白そうで作ってみたいけど、実際にコンパクトに収めることできるのか考えてみた。





まず、Pawtrackだけど、多分、機械(装置)が入ってる部分が2か所あって、上のオレンジの部分と、下の黒い部分。(オレンジの部分は中身ないかも?)
黒い部分は、1cmくらい厚みありそう?そしたら、結構もの入れれそうだな。


今、自分が作るなら小さくできなそうな部品が3つ。

  • モバイル通信モジュール
  • PIC+回路
  • バッテリー

これらのサイズを調べると次のような感じ。

モバイル通信モジュール

以前にも使ったことがある3GIMが小さいのでそれを基準に考える。
35mm×25mm×7mm
重さ 7.5g
値段 26,000円
http://tabrain.jp/3GIM_V2.0/Tabrain3GIMV2Press20160210.pdf
https://www.switch-science.com/catalog/2607/

PIC+回路

PIC32MXのDIPをイメージすると、
35mm×20mm×5mm (回路付きでザックリ)
重さ 8g  (回路付きでザックリ)

バッテリー

リチウムイオンポリマー電池の小さいの選ぶ。
容量:110mAh
サイズ:5.7mm×12mm×28mm
重さ: 2.65g
値段 1,000円
https://www.switch-science.com/catalog/506/


全部の長さ合わせると、 35mm + 35mm + 28mm ≒ 100mm

大体、pawtrackの黒い部分と同じじゃない?多分、これらみたいなものがあの中に入ってる。
あと、重さはpawtrackが50gらしいけど、上記3つを足して20g弱と思うので、重量も特別すごい感じはしない。

時間がたったらもっと性能良くて小さい電子部品になるはずだから、将来はもっといいの作れそう。

2016年6月26日日曜日

ネコ用のGPSロガーPawtrack面白いね

ネコって結構動いてるらしい。
このツイートでそのこと知った。
元になってる記事が「GPS Trackers That Show Cats’ Activity During The Night」 でいくつか写真も出てる。





家と道路の雰囲気が外国ですねぇ。

GPS付けるとネコの足取りが分かる!面白い!

Pawtrack という会社がネコ専用のGPSトラッカー販売している。



GPS情報を送信できる首輪を付けると、どこにいるかネット経由で見れると。



価格は日本円で2万円くらい。

テッククランチでも紹介してる。
猫専用のGPS首輪Pawtrack、家にいるときは電池を節約


ただ、日本だと利用できないらしい。Yahoo知恵袋に質問出てた。

pawtrackは2g、別名gsm、gsrm電波でインターネットにつながるるそうです。これの周波数は国際規格だそうで、使っていないのは、韓国、北朝鮮、日本、ツバルだけだそうです。
利用できない理由が、インターネット接続に利用する携帯電話の電波規格が原因みたい。GPSのログをとって、後で端末から回収するタイプは日本でも販売されている。

GPSロガー i-gotU GT-120 という商品だと、Amazonで6400円。



i-gotU GT-600という商品だと、8600円。



レビューを見ると結構好評だが、主な使い道は浮気調査っぽい。。(汗)


ネコ用のGPS発信機付き(ロガーだけではなく)首輪、良いの作れたら日本でも売れそうだな。

  • 小型で軽量であること
  • 充電なしに長時間利用できること
  • 防水でネコに負担をかけない事
のあたりを達成できるといいね。



2016年6月25日土曜日

Arduinoで液晶(M032C1289TP)表示できなくて心折れた。。

液晶に表示したくて買ってみたんですよM032C1289TPっていうの。
http://www.aitendo.com/product/3861

aitendoの3.2インチ液晶モジュールを動かす」とかはとても親切に書いてあるので自分でもできるかなと思ったけどダメだったorz

配線したけどバックライト付けるのが精一杯。



以下、自分がやったことの手順メモ。
(これやっても動かなかったよ!!)

1. M032C1289TPにピンソケットをはんだ付け(40ピンのソケット持ってなくて足りない部分をペンチで切ったりやすりがけして削ったりして40ピン分にするの大変だった)

2. UTFTのライブラリを本家サイトからダウンロード

3. Arduinoのエディタ起動して、「スケッチ」→「Include Library」→「Add .ZIP Library...」から、UTFTのライブラリを選択して登録する

4. Arduinoのライブラリが追加されるが、メモリエラーになるので次のファイルを変更
C:\Users\Hisao\Documents\Arduino\libraries\UTFT\memorysaver.h

//#define DISABLE_SSD1289 1
これを残した以外の、コメントアウトを外す。

5. 液晶のピンの数字を確認する(まず、19ピンを3.3V、1ピンをGNDに接続するとバックライト付くのでそれで確認すると間違いなさそう)

6. UTFT\Documentation\UTFT_Requirements.pdf みながら、Arduionoと液晶のピンを対応表通りに接続する
(液晶のRS、WR、CS、RESTをそれぞれA5、A4、A3、A2に接続してみた)

7. UTFT\examples\Arduino (AVR)\UTFT_Demo_320x240 に入っているスケッチを開く

8. 設定を使うハードウェアに合わせて変更
UTFT myGLCD(ITDB32S,38,39,40,41);

UTFT myGLCD(SSD1289_8,A5,A4,A3,A2);     // aitendoのM032C1289TP (QVGA)

9. 書き込み

10. 実行!

11. 動かない(絶望。。。)


きっと神様が液晶じゃないことやれって言ってるから、一旦諦めよう。

2016年6月10日金曜日

PIC32MXのsleepとかwaitとかdelayする関数について

結論: 無い。

PIC32はdelayするマクロが用意されていないらしい。( yahoo知恵袋 )
別に正確じゃなくていいから、sleep(3) とかそういうことがしたいのよ。。

いろいろ調べてTimer触ったので記念にメモ。

MPLAB Harmonyというものについて

PIC32MXの開発では、開発環境拡張のHarmonyを利用するようになってきているらしい。ネットで少し古いソースコード参考にすると、開発環境に含まれないライブラリをインクルードしてたりして困る。Harmonyには、設定を簡単にするGUI、コードジェネレータ+ライブラリがセットになってる感じだった。Harmonyを使うと20~40%も開発効率があがるとかなんとか。
便利そうだしPIC32の開発に使ってみようと思った。

インストールはググったページみながらやればOK。「MPLAB Harmonyのインストール手順


MPLAB Harmony使ってみる

MPLAB Harmonyの使い方」というページから順にやってみた。丁寧に書いてあるなぁ。。
まずは、コードジェネレータだけ試した。生成したコードをPICKIT3で焼いたらそのままできたのでOK。


タイマーについて

分からない。分からない。分からない。分からない。分からない。本当に分からない。
動かしたけどあってるか自信ない。よく、皆こんな情報だけで動かせるなぁ。。素人にはキツイぜ。

本家サイトの「Using Harmony to Control Timers」に次の表がある。


取りあえず、staticが簡単で使いやすいらしい。

考え方としては、タイマのオシレータに内部クロックを使う場合、
(ペリフェラルクロック) / (プリスケール) / (カウンタ) = 割り込みの頻度
になる。

MPLAB Harmonyの使い方(4)」は前ページで30MHzに設定しているので、それをベースに記述してある。

私は、オシロとか持ってないのでLEDチカチカで割り込みの頻度を確認することにした。PICはいつものPIC32MX120F032B。

タイマ確認手順

まず、harmonyのGUIでクロック設定。Auto-Calculateボタンを押して、表示されるダイアログで20MHzを設定した。


システムクロックを20MHzにすると、デフォルトでペリフェラルバスクロックが半分の10MHzになる。


次にタイマの設定で、MPLAB Harmonyの使い方(4)に書いてある図と自分の設定が合わなくて困った。使い方(4)にある図は次のもの。

一方、私のはこんな感じで若干選択できる項目違った。。


特に分からなかったのが、Clock Sourceで「DRV_TMR_CLKSOURCE_INTERNAL」のINTERNALってなんじゃい!!っていうとこ。参考にしたサイトはPERIPHERAL_CLOCKってあるのに、それが選べなくて悩んだ。
それで、途方にくれながらソースコード生成して、ソースコードジャンプしたら、INTERNALは、PERIPHERALとして取り扱ってるような記述だった。深く考える必要なし(笑)

で、私は10MHzで1秒ごとにLEDを点滅させる作戦だったので、プリスケール256として、timer周期が25.6㎲。よって、1秒の割り込みするなら1/25.6㎲=39063(Timer Period)とした。


設定をしたら、「Generate Code」ボタンを押してソースコード吐き出す。

あとは、Using Harmony Static Drivers to Control Timers を見ながら初期設定を書いてあげた。(最初、 MPLAB Harmonyの使い方(4) だけみながらやったがなんかうまくいかなかったので本家も見た)

app.c の初期化部分で、TRISAレジスタを設定して、RA0を使えるようにして、system_interrupt.c のLEDチカチカする部分こんな感じにした。
---------------------
int status = 0;
    
void __ISR(_TIMER_1_VECTOR, ipl4AUTO) IntHandlerDrvTmrInstance0(void)
{
    PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_1);
    status = !status;
    PORTA = status;
}
---------------------

そしたらこんな感じ。



PICは難しいねぇ(笑)

2016年6月5日日曜日

PIC32MX120F032Bで液晶(ACM0802C-NLW-BBH)が動かしたかった。。

動かなかった。。
取りあえず勉強になったのでメモ。



まず、今回やりたかったことをやっていたサイトから。(ソースコードも大体書いてある)
ACM0802C-NLW-BBHを使ってみる ハード編
LCDモニターについて

簡単そうに書いてあるんだけど出来ない!!

今回調べて知ったこと

PIC32MXについて

delayっていうユーティリティメソッドが無い!32bitのpicではdelayが無いのでタイマーを利用したロジックを書かないといけない。
まず、これがすごい面倒くさいんですよ。
液晶の制御で○○㎲以内とか、○○㎲以上のウェイトするとか、指定あるから。

今回、こうしてみたけど多分、間違ってる。

まず、コンフィグで80MHzで動作してるはず。
次に、レジスタ設定でタイマーを有効化して、1/256を設定。
    T1CON = 0x8030; // TMR1 on, prescale 1:256 PB
こうすると、タイマーのカウンタが80MHzの1/256でカウントアップされるのではなかろうか?(推測)
それなので、waitの関数をこうやって定義してみた。

void wait_us(unsigned int us){

    // 今回のタイマー設定なら、80MHzの256分の1の割り込みで3usになるはず。

    unsigned int val = us / 3 + 1;

    TMR1 =  0;

    while ( TMR1 < val){}

}

(この考え方が本当にあってるのか、今度、LEDチカチカでざっくり測定してみよう)

2016/6/10 追記:

上の考え方間違ってる。ブログ記事書いた。


液晶(ACM0802C-NLW-BBH)について

どうやって制御するのか全く知らなかったのでとっつき方が分からなくて大変だった。
まず、データシート開いて、全14ピンの機能を確認。


4bitモードで利用するときは、DB0~3は未使用なのでGND。
また、R/Wピンは、今回writeしかしないのでGNDでOK。(そのため、ソースコードに書かなくてよい)

初めてタイミングチャートなるものを見た。書き込みの場合のタイミングチャートが次のもの。



この図があらわしているのは、RSピンを1or0にして、R/Wピンを0にして、Eピンを1にして、DBピンでデータ書き込むということ。
へぇ、なるほどねぇ。

液晶のピンとPICのピン(BRとか)を1つずつ接続してあげれば、PICから命令できるようになるようだ。(出来なかったけど!)

一応、ソース。

Lib_LCD.h
================
#ifndef LIB_LCD_H
#define LIB_LCD_H

#include <xc.h>

// 参考1: http://amahime.main.jp/lcd/main.php?name=lcd
// 参考2 : http://minkara.carview.co.jp/userid/1540421/blog/27503415/

/********************************************
 * 液晶表示器用ライブラリ ACM0802C-NLW-BBH専用
 ********************************************/
#define LCD_PORT    PORTB   // DBピンの出力ポート(RB0~RB3を使う)
#define LCD_RS      PORTBbits.RB5     // RSピンの接続ポート
#define LCD_E       PORTBbits.RB6     // E(STB)信号
// LCDのデータシートに書いてあるタイムチャートには次の4つが書いてある
// 1. レジスタ選択信号(RS)
// 2. 読み出し/書き込みの選択信号(R/W)
// 3. 動作起動信号(E)端子
// 4. 入出力データ信号(DB0~DB7)

#define RS_CMD  0
#define RS_DATA 1


void lcd_send(char code, int rs);
void lcd_str(char *str);
void lcd_data(char data, int);
void wait_us(unsigned int);
void wait_ms(unsigned int);


void lcd_init(void){
    wait_ms(30);

    // Function set
    lcd_send(0x02, RS_CMD);
    lcd_send(0x02, RS_CMD);
    lcd_send(0x08, RS_CMD);
    wait_us(50);

    // Display ON/OFF control
    lcd_send(0x00, RS_CMD);
    lcd_send(0x0C, RS_CMD);
    wait_us(50);
 
    // Display Clear
    lcd_send(0x00, RS_CMD);
    lcd_send(0x01, RS_CMD);
    wait_ms(2);
 
    // Entry Mode Set
    lcd_send(0x00, RS_CMD);
    lcd_send(0x06, RS_CMD);
    wait_ms(5);
 
}

// ビットチェンジ及び信号制御
void lcd_send(char code, int rs){
    // 4bit命令用のマスク(RB0~RB3までを使い、他のbitは状態を残す。)
    LCD_PORT = (LCD_PORT & 0xF0) | (code & 0x0F);
 
    LCD_RS = rs;     // 0: コマンド、1: データ
    wait_us(40);
    LCD_E = 1;
    wait_us(1);
    LCD_E = 0;
}

// 文字列を出力する
void lcd_str(char *str){
    while(*str != 0x00){
        lcd_data(*str, RS_DATA);
        str++;
    }
}

void lcd_data(char data, int rs){
    lcd_send(data >> 4, rs);
    lcd_send(data, rs);
    wait_us(50);
}

// 指定した時間だけ待機する(ただし、正確ではない。)
void wait_us(unsigned int us){
    // 今回のタイマー設定なら、80MHzの256分の1の割り込みで3usになるはず。
    unsigned int val = us / 3 + 1;
    TMR1 = 0;
    while ( TMR1 < val){}
}

void wait_ms(unsigned int ms){
    int i;
    for(i=0; i<ms; i++){
        wait_us(1000);
    }
}

#endif /* LIB_LCD_H */
================


main.c
================
#include <xc.h>
#include "Lib_LCD.h"

// Config settings
// POSCMOD = HS, FNOSC = PRIPLL, FWDTEN = OFF
// PLLIDIV = DIV_2, PLLMUL = MUL_16
// PBDIV = 8 (default)
// Main clock = 8MHz /2 * 16    = 80MHz
// Peripheral clock = 80MHz /8  =  10MHz

// Configuration Bit settings
// SYSCLK = 80 MHz (8MHz Crystal/ FPLLIDIV * FPLLMUL / FPLLODIV)
// PBCLK = 10 MHz
// Primary Osc w/PLL (XT+,HS+,EC+PLL)
// WDT OFF
// Other options are don't care
//
#pragma config FPLLMUL = MUL_20, FPLLIDIV = DIV_2, FPLLODIV = DIV_1, FWDTEN = OFF
#pragma config POSCMOD = HS, FNOSC = PRIPLL, FPBDIV = DIV_8

char dispText[] = "HELLO";

void init_pic(){
    // disable JTAG port
    DDPCONbits.JTAGEN = 0;

    TRISA = 0;      // all PORTA as output
    TRISB = 0;

    // wait関数のためにタイマ設定
    T1CON = 0x8030; // TMR1 on, prescale 1:256 PB
}

void main(void) {
    init_pic();
    lcd_init();
    
    //lcd_data(0x81, RS_CMD);
    //lcd_data(0x30, RS_DATA);    // 0
    
    // 液晶に表示
    lcd_send(0xC0, RS_CMD);
    lcd_str(dispText);
     
    while(1){
    }
    return;
}
================


まとめ


今回、まずPICの回路で電解コンデンサ付ける場所間違えてて、
Failed to program device
Selected device and target: memory mismatch.
ってエラー出たのでハマってた。(19,20で繋がないといけないのに、18,19で繋いでた)

今回失敗した原因と思わしき場所
・waitの時間が正しくない
・回路でLCDが5V(アダプタから供給)、PICが3V(PICKITから供給)と2つ使ってるからダメ
・回路間違ってる?

次の装置は動くようにお祈りしましょう。

2016年6月2日木曜日

彼女とボートでクルージングするために小型船舶免許を取得しました

皆さん、海は好きですか?

海ってほんといいですよね。のびのびしてて。
海・川・湖のレジャーの幅を広げようと思いまして、小型船舶免許(2級)を取得しました!
(海好きな子けっこう多いですよ。)

私も国家資格である「小型船舶操縦士」になったわけです。
この試験、1億人が受験したら1000万人不合格者が出るというほど難しいそうなので、気合を入れて勉強しました。努力の甲斐あって、見事一発合格です!!

免許があるとできること

小型船舶免許がありますとこんな船で釣りしたりできます。


免許的には20トン(容積なのでかなり大きい)までOKなので全長20mくらいまでは大体大丈夫かと思います。
高級なタイプだとこういうのもOK。


内装も立派。


このくらいのボートで遊ぶのが現実的かな。


一級と二級の違い

小型船舶免許は「一級小型船舶操縦士」と「二級小型船舶操縦士」の2種類あって、今回私が取ったのが2級の方です。一級と二級の免許の違いは、海において陸からどこまで離れて良いかだけで、一級は無制限、二級は5海里(約9km)となります。

試験内容は、一級の出題範囲が増えますが、二級と実技は同じなので、二級と一級と難易度的には大きく変わらない印象です。


彼女とクルージングするために必要なもの

  • 小型船舶免許
  • ボート
  • 彼女
あと2つ!!