PIC12F1822でFC-102を光らせる

まずはMCCでクロックを内蔵オシレーター8MHzx4PLLの32MHzに設定して、RA2を出力に設定してソースファイルを生成(Generate)。
main.cにビット0を送る関数((void) send_bit0(void))とビット1を送る関数((void) send_bit1(void))をアセンブラで書いて、メインループで次のように send_bit0(); だけにして、まずは send_bit0(); が正しく動くかを確認。

send_bit0を実装

while (1) {
    // Green
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    // Red
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    // Blue
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    send_bit0();
    __delay_us(50);
}

最初、全部(16個)のLEDがMAXで白く発光して「どういう事だよ…」となったけど、よく調べたらクロックが8MHzになっててx4PLLされてなかったりして、ちゃんと32MHzで動くようにして再度調整。調整した結果がコレ。

void send_bit0(void)
{
    // 0.5, 2.0us
    // 4, 16 insts
#asm
    movlb 2 ; BANK 2
    bsf 12, 2 ; LATA, 2
    nop
    movlb 2 ; BANK 2
    bcf 12, 2 ; LATA, 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
#endasm
}

send_bit1を実装

(void)send_bit1(void) も調整。

void send_bit1(void)
{
    // 1.2, 1.3us
    // 10, 10 insts
#asm
    movlb 2 ; BANK 2
    bsf 12, 2 ; LATA, 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    movlb 2 ; BANK 2
    bcf 12, 2 ; LATA, 2
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
    nop
#endasm
}

結果としてwhileループの最後の__delay_us(50);__delay_us(70);に調整。
最初のうちは24ビットしか送ってないのにLEDが2つ光ったりしてタイミングの調整が大変だった。でも、意外にもアセンブラで書いたのは (void)send_bit0(void)(void)send_bit1(void) の2つだけで動いた。

send_byteを実装

続いて1バイトを送信する void send_byte(unsigned char b) を書いた。

void send_byte(unsigned char b)
{
    if (b & 0x80) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x40) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x20) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x10) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x08) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x04) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x02) {
        send_bit1();
    } else {
        send_bit0();
    }
    if (b & 0x01) {
        send_bit1();
    } else {
        send_bit0();
    }
}

main.cファイル

今回のmain.cのファイルです。
MCCで生成したmain.cを差し替えると、次のような感じで光ります。
アニメーションはしません。

FC-102をPIC12F1822で制御。
電池はFC102の駆動用。
FC-102をPIC12F1822で制御
FC-102をPIC12F1822で制御。
どちらも電池(6V)で駆動中。
PICもFC-102も電池で駆動中

回路図

ICSP回路付き。
ICSP回路付き
電池駆動時の回路。
電池駆動時の回路

カテゴリー: PIC, ソフトウェア, 回路 | タグ: , , | コメントする

MPLAB X IDEでアセンブラを使う

FC-102(Rainbow LED)をPICで動かそうと、データシート(WS2811)を確認したらタイミングが凄くシビア。
0.5μSとか1.2μSとか。xc8の__delay_us()だって整数しか渡せない。
「他の人はどうしてるの?」とググったらアセンブラで書いていた。
32MHzで動かせば、1命令当たり4サイクルで動くから1命令0.125μS。0.5μSは4命令(0.5μS)くらいまで大丈夫そうだ。

で、PICのアセンブラなんて書いた事ないから、とりあえずCでLチカを書いて、それをアセンブラに書き換えてみようと.asmファイルを書いたら、mpasmx(アセンブラのコマンドだと思う)の実行で”Bad CPU type in executable”とか出てきた。調べると、macOS Catalina以降では32ビットのアプリは動かないそうで、mpasmxというコマンドは32ビットのアプリらしく、動かないという事のようだ。

しょうがないという事で、「じゃあ、XC8のインラインアセンブラで書けばいいや」とXC8のインラインアセンブラのディレクティブ #asm, #endasm で囲って書いたけど、#asm, #endasm を認識しない…という問題が。

調べたら、プロジェクのPropertiesのXC8 Global Optionsの”C standard”を”C 90″に設定して、XC8 Compilerの”Preprocessing and messages”の”Use CCI syntax”をONに設定すれば使える事がわかった。

XC8 Global Options
XC8 Compiler

追記:
WikipediaのPICの命令

カテゴリー: PIC, ソフトウェア | タグ: , , , , , , | コメントする

MicroPythonのドキュメント

MicroPythonのドキュメントを見つけたのでBookmark。
MicroPython 1.12 ドキュメント

カテゴリー: Bookmark, LEGO | タグ: | コメントする

チェビシェフ脚

チェビシェフ脚というリンク機構を知ったので、LEGOで作ってみました。

チェビシェフ脚についてはこちらを参照のこと。

カテゴリー: LEGO, 作ったモノ | タグ: , , | コメントする

ADKって何だっけ?

YouTubeのアナリティクス画面を見ていて「MPU-6050 + Arduino UNO + ADK + Android」というタイトルの動画が見られているのがわかった。

「これ、何だっけ?」と思ったら、AndroidにArduinoを介してセンサーとかを接続できるADKというライブラリだった。ADKの発表は2011年でかなり古い。

Smartphone Worldの記事
リアルとアプリをつなぐ「Android Open Accessory Development Kit(ADK)」とは ―― Androidとクラウドとハードウェアの未来

Androidの開発者サイトでの概要
周辺機器・概要

Arduinoのサイトでのガイド
Guide to the Arduino ADK
This is a retired productって書いてある…

カテゴリー: Android, Arduino, Bookmark | タグ: | コメントする

コンデンサーの単位変換表

偶然見つけたのでリンクへ追加しました。

Standard Capacitor Values Conversion Chart pF – nF – uF

カテゴリー: Bookmark | タグ: , | コメントする

やってみよう!#3 可変抵抗器(ボリューム)を調査する

やってみよう!シリーズの第3弾として、「可変抵抗器(ボリューム)を調査する」をYouTubeにアップロードしました。

カテゴリー: やってみよう!, 基礎知識, 部品 | タグ: , , , | コメントする

PiStorms

こんなものあるんですね!
EV3の代わりにRaspberry Piを使ってロボットを動かすみたいな。
PiStorms LEGO Interface

PiStormsのシステムイメージ図
サイトからのイメージ

カテゴリー: LEGO, Raspberry Pi, ロボット | タグ: , , | コメントする

EV3 Micro Python

EV3 Classroomを見つけた時、さらにPython環境も見つけた。
LEGO純正でなければ以前からあったようだけど、LEGOの純正としてPython(Micro Python)環境として出してきたようだ。

LEGOによるPython環境
EV3用 Python

ここの解説が上のページのリンク先のPDFの解説と同じ
EV3 with MicroPython | LearningSystems

EV3 MicroPythonを入れたSDカードで起動&終了の動画です。
小さい字がズラーッとスクロールして面白い。

Pythonが使えるのは良いけど、USBケーブルでつながないといけないので、ちょっとした事はBluetoothで転送できるEV3 Classroomの方が楽かも。

カテゴリー: LEGO, ソフトウェア | タグ: , , , | コメントする

MINDSTORM EV3のmacOSでの新しいプログラミング環境

以前のMINDSTORM EV3のアプリがmacOS Catalinaではこんな感じになって起動できなくなっていた。元々、ビジュアル・プログラミングって好きじゃないからそのままにしていたけど、そのまま放りっぱなしじゃもったいないから、ちょっと調べたら新しい環境が出ているらしかった。

古いアプリ(Education版)
古いアプリ(Education版)
古いアプリ(Home版)
古いアプリ(Home版)

見つけたのはここ↓
LEGO Mindstorms EV3 + EV3 Classroom で Hello World
わかりやすいので、説明のままやればOK。

LEGOのソフトウェアのページ
MINDSTORMS ソフトウェアをダウンロード

インストールすると、こんなアイコン。

新しいアプリ(EV3 Classroom.app)
新しいアプリ

実行すると、こんな感じ。

EV3 HelloWorld

プログラムの転送はBluetooth、USBが選べるので特に問題なければBluetoothで繋ぐと便利。

カテゴリー: LEGO, ソフトウェア | タグ: , , | コメントする