Longan NanoでUSB CDC転送(まだまだ)

Longan NanoでUSBのCDC転送にチャレンジしてみました。CDCで転送ができるとUSBケーブル一本でコンソール出力できる可能性があるからです。

で、まだまだまだまだ道のりは遠いですが、とりあえずライブラリのサンプルプログラムを無理やり動かしてCDC転送はできました。

まず、Platform IOで通常通り、プロジェクト作成します。デバイスは sipeed longan nanoです。

サンプルプログラムについてはGD32VF103_Firmware_Library_V1.0.1の中のExamples/USBFS/USB_Device/CDC_ACMの下にあるものを使用しました。

Sourceディレクトリの中の以下のファイルをプロジェクトディレクトリのsrcの下に放り込みました。

  • app.c
  • cdc_acm_core.c
  • gd32vf103_hw.c
  • gd32vf103_it.c
  • system_gd32vf103.c

同じく、Includeディレクトリの中の以下のファイルをプロジェクトディレクトリのincludeの下に放り込みました。

  • cdc_acm_core.h
  • gd32vf103_it.h
  • gd32vf103_libopt.h
  • usb_conf.h
  • usbd_conf.h

さらに、ドライバは、GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driverの下にあるものを同様に

Sourceディレクトリの中の以下のファイルをプロジェクトディレクトリのsrcの下に放り込みました。ファイル名に usbh を含むもの、および dev_usb_host.c はホストモードのドライバっぽく、コンパイル中にエラーになるので外しました。

  • drv_usb_core.c
  • drv_usb_dev.c
  • drv_usbd_int.c
  • usbd_core.c
  • usbd_enum.c
  • usbd_transc.c

同じく、Includeディレクトリの中の以下のファイルをプロジェクトディレクトリのincludeの下に放り込みました。同様にファイル名に usbh を含むもの、および dev_usb_host.h は外しました。

  • drv_usb_core.h
  • drv_usb_dev.h
  • drv_usb_hw.h
  • drv_usb_regs.h
  • drv_usbd_int.h
  • usb_ch9_std.h
  • usbd_core.h
  • usbd_enum.h
  • usbd_transc.h

platformio.iniは以下のように編集しました。

[env:sipeed-longan-nano]
platform = https://github.com/sipeed/platform-gd32v.git
board = sipeed-longan-nano
framework = gd32vf103-sdk
upload_protocol = dfu
build_flags = -D USE_USB_FS -D__packed=

ソースコードの中で FIFO のサイズに関するマクロ定義の揺れがあるようで、今回は usb_conf.h を以下のように修正しました。

修正前は以下のような感じ。

#ifdef USB_FS_CORE
    #define RX_FIFO_FS_SIZE                         128
    #define TX0_FIFO_FS_SIZE                        64
    #define TX1_FIFO_FS_SIZE                        128
    #define TX2_FIFO_FS_SIZE                        0
    #define TX3_FIFO_FS_SIZE                        0
#endif /* USB_FS_CORE */

修正後は以下のようにかく定義の頭に USB_ を追加したものを入れています。

#ifdef USB_FS_CORE
//    頭に USB_ を追加
    #define RX_FIFO_FS_SIZE                         128
    #define USB_RX_FIFO_FS_SIZE                         128
    #define TX0_FIFO_FS_SIZE                        64
    #define USB_TX0_FIFO_FS_SIZE                        64
    #define TX1_FIFO_FS_SIZE                        128
    #define USB_TX1_FIFO_FS_SIZE                        128
    #define TX2_FIFO_FS_SIZE                        0
    #define USB_TX2_FIFO_FS_SIZE                        0
    #define TX3_FIFO_FS_SIZE                        0
    #define USB_TX3_FIFO_FS_SIZE                        0
#endif /* USB_FS_CORE */

これでビルドして書き込んでやると、dmesgに以下のように出力されて、/dev/ttyACM0 として認識されました。

[ 3666.200001] usb 2-1: USB disconnect, device number 2
[ 3666.511918] usb 2-1: new full-speed USB device number 3 using uhci_hcd
[ 3666.732800] usb 2-1: New USB device found, idVendor=28e9, idProduct=018a, bcdDevice= 1.00
[ 3666.732804] usb 2-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[ 3667.146893] cdc_acm 2-1:1.0: ttyACM0: USB ACM device
[ 3667.148475] usbcore: registered new interface driver cdc_acm
[ 3667.148476] cdc_acm: USB Abstract Control Model driver for USB modems and ISDN adapters

$ sudo screen /dev/ttyACM0 9600

で screen で接続するとエコーバックされました。

wireshark でモニタするために公式ページの説明にそってセットアップします。

$ groups $USER
xxx : xxx adm cdrom sudo dip plugdev lpadmin sambashare
$ sudo adduser $USER wireshark
ユーザー `xxx' をグループ `wireshark' に追加しています...
ユーザ xxx をグループ wireshark に追加
完了。
$ sudo dpkg-reconfigure wireshark-common
$ sudo modprobe usbmon
$ sudo setfacl -m u:$USER:r /dev/usbmon*
$ sudo wireshark 
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'

screenコマンドで接続したまま、usbmon0を選択してキャプチャして、キーボードで適当にカチャカチャ打ってエコーバックされるのを確認したあと、キャプチャを停止します。結果を見ますが、キーボード入力に伴うINTERRUPT転送が見えて鬱陶しいので、表示フィルタを以下のように設定してBULK転送のみが見えるようにします。

usb.transfer_type == 0x3

設定すると、以下のような感じになりました。

キーボードで「B」を入力してそれがホスト(host)からLongan Nano(6.13.3)へ送られたときのキャプチャです。カーソルのあるところが送信されたデータ(0x42)です。

それに対してエコーバックが帰ってきたのが以下です。

データが戻ってきているのがわかります。

とりあえず、CDCでエコーバックされるサンプルは動いたのですが、該当部分のソースを見ると、

    while (1) {
        if (USBD_CONFIGURED == USB_OTG_dev.dev.cur_status) {
            if (1 == packet_receive && 1 == packet_sent) {
                packet_sent = 0;
                /* receive datas from the host when the last packet datas have sent to the host */
                cdc_acm_data_receive(&USB_OTG_dev);
            } else {
                if (0 != receive_length) {
                    /* send receive datas */
                    cdc_acm_data_send(&USB_OTG_dev, receive_length);
                    receive_length = 0;
                }
            }
        }
    }

ということで、パケットバッファのデータを取り出さずにそのまま返送しているっぽいです。これをUSBシリアルっく使えるようにするにはもうひとひねり必要そうです。

 

久しぶりにLongan Nano

久しぶりにLongan Nanoを触ります。

LinuxをLinuxMint18.3に更新したので、再度Platform IOの環境から構築し直します。手順は、前回のこれこれと同じ。

Lチカまで確認できたら、GitHubにあるサンプルプログラムを動かしてみます。まずは、ZIPでダウンロードしてきて展開します。

Platform IOで新規プロジェクトを作成します。プロジェクト作成時には、ボード名は「Sipeed Longan Nano」を選択します。(Sipeed Longan Nano Lite)

作成したら、ダウンロードしてきたサンプルプログラムのgd32v_lcdディレクトリの中のincludeとsrcディレクトリの中身をvscodeのプロジェクトディレクトリのincludeとsrcディレクトリにそれぞれドラッグ&ドロップします。フォルダごとコピーしてworkspaceに追加するか聞いてくるので、「Copy Folders」を選択してコピーします。

platformio.ini を選択して編集します。

[env:sipeed-longan-nano-lite]
platform = https://github.com/sipeed/platform-gd32v.git
framework = gd32vf103-sdk
board = sipeed-longan-nano-lite
upload_protocol = dfu

下の方のチェックマークと右向き矢印でビルドと書き込みができました。画像のファイルの方は put_into_tf_card フォルダの中身を microSD に書き込んで、基板に挿入しておくと、リセットでロゴと動画が再生されました。

さて、やりたいのはデモプログラムを動かすことではありません。せっかくLCDといろんなI/Oがついているボードですから、工作に使いたい。そこで、まずはLCDとUARTを動かしたいところです。

で、いろんなところを参考に・・・というかパクらせてもらいながら作ったのが下記の main.c 。

#include "lcd/lcd.h"
#include "gd32v_pjt_include.h"
#include <stdio.h>
#include <string.h>

void init_uart0(void)
{	
	/* enable GPIO clock */
    rcu_periph_clock_enable(RCU_GPIOA);
    /* enable USART clock */
    rcu_periph_clock_enable(RCU_USART0);

    /* connect port to USARTx_Tx */
    gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
    /* connect port to USARTx_Rx */
    gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

	/* USART configure */
    usart_deinit(USART0);
    usart_baudrate_set(USART0, 115200U);
    usart_word_length_set(USART0, USART_WL_8BIT);
    usart_stop_bit_set(USART0, USART_STB_1BIT);
    usart_parity_config(USART0, USART_PM_NONE);
    usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE);
    usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE);
    usart_receive_config(USART0, USART_RECEIVE_ENABLE);
    usart_transmit_config(USART0, USART_TRANSMIT_ENABLE);
    usart_enable(USART0);

//    usart_interrupt_enable(USART0, USART_INT_RBNE);
}

int main(void)
{
    rcu_periph_clock_enable(RCU_GPIOA);
    rcu_periph_clock_enable(RCU_GPIOC);
    gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13);
    gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1|GPIO_PIN_2);

    init_uart0();

    Lcd_Init();			// init OLED
    LCD_Clear(BLACK);
    BACK_COLOR=BLACK;

    LEDR(1);
    LEDG(1);
    LEDB(1);

    LCD_ShowString(24,  0, (u8 *)("Hello World !!"), WHITE);
    LCD_ShowString(24, 16, (u8 *)("Hello World !!"), BLUE);
    LCD_ShowString(24, 32, (u8 *)("Hello World !!"), RED);
    LCD_ShowString(24, 48, (u8 *)("Hello World !!"), GREEN);
    LCD_ShowString(24, 64, (u8 *)("Hello World !!"), GBLUE);
    Draw_Circle(120,40,25,RED);
    LCD_DrawLine(120,0,130,80,BLUE);
    LCD_DrawRectangle(120,40,159,79,GREEN);
    LCD_Fill(130,20,150,30,MAGENTA);
    int c = 0;
    u8 buf[16];
    while (1)
    {
        sprintf(buf,"%d ",c);
        LCD_ShowString(24,  0, buf, WHITE);
        LCD_ShowString(24, 16, buf, BLUE);
        LCD_ShowString(24, 32, buf, RED);
        LCD_ShowString(24, 48, buf, GREEN);
        LCD_ShowString(24, 64, buf, GBLUE);
        LEDR_TOG;
        delay_1ms(20);
        LEDG_TOG;
        delay_1ms(20);
        LEDB_TOG;
        delay_1ms(20);
        usart_printf("COUNT = %d\r\n",c++);
    }
}

int _put_char(int ch)
{
    usart_data_transmit(USART0, (uint8_t) ch );
    while ( usart_flag_get(USART0, USART_FLAG_TBE)== RESET){
    }

    return ch;
}

#include <stdarg.h>
void usart_printf(const char *fmt, ...) {
    char buf[100];
    va_list args;
    va_start(args, fmt);
    vsprintf(buf, fmt, args);
    va_end(args);

    char *p = buf;
    while( *p != '\0' ) {
        _put_char(*p);
        p++;
    }
}


まずは情報源。

LCDライブラリの使い方はこちらのページこちらのページを参考にさせていただきました。UARTの使い方はこちらを参考に、ライブラリのサンプルを見ながら試行錯誤しました。

ライブラリのサンプルなどは http://dl.sipeed.com/LONGAN/Nano/ の下のSDKの下にあるようです。ただ、現時点では基本的なものしかないような感じ。そうはいっても、参考にはなりそうです。UARTもできれば割り込みで動かしたいので、必要な情報はそれなりにありそうです。

今日はこのあたりまで。手探りだと時間がかかりますね・・・。

特定の端末を探すのを省力化

TTGO T-Cameraで監視している3Dプリンタですが、DHCPでアドレスを振っているのでたまにIPアドレスが変わってしまうことがあります。

そこで、MACアドレスを検索してブラウザで開くbashスクリプトを書いてみました。(超手抜きです)

#!/bin/bash
rt=`arp -a | grep "xx:xx:xx:xx:xx:xx"`
if [[ ${rt} =~ ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+) ]]; then
  ip=${BASH_REMATCH[0]}
  echo ${ip}
  /usr/bin/google-chrome-stable --incognito ${ip}
fi

2行目のgrepのところにあるのがMACアドレスです。arpテーブルから当該MACアドレスを探して、そのIPアドレスをGoogle chromeのシークレットモードで開くという単純なものです。

小型PCのSSDをリムーバブルに改造

あまり使用していないPCがあるのですが、これを実験用にするため、SSDをリムーバブルに改造してみました。

改造後の状態はこんな感じです。

もともとのスリムFDD取付用の場所にマウンタを作って付けてみました。基板は使わなくなったセンチュリーの「裸族のインナー(CRIN2535)」の基板だけを流用してみました。7mm厚のSSDしか使えませんが、SSDも安くなっているので問題ありません。

もう1台、同じケースのPCがあるのですが、こちらも今マウンタを出力中です。これで安いSSDを付けて実験マシンにしたいと思います。

写真ではわかりませんが、今回はABSで出力したのですが、やはり反りが結構きついです。自分の使い方だと寸法を十分に検討してPLAで出力するほうが楽なようです。

Longan NanoでLチカ

引き続き、Longan NanoでLチカにトライしてみます。

PlatformIOのロゴをクリック(①)、Openをクリック(②)、Project Examplesをクリック(③)します。

GD32Vのarduino-blinkをクリックして選択して、Importをクリックします。

サンプルプロジェクトが作成されますので、プロジェクトディレクトリの中のplatform.iniを選択(①)して編集します。
まず、ボード定義のうち、不要な部分(gd32vf103v-evalの方、②の部分)を削除します。続いて、書き込み方法として

upload_protocol = dfu

を③の部分(env:sipeed-longan-nanoの中)に追加します。

更新したら①のマークをクリックしてビルド(コンパイル)します。成功すると②のような感じで結果が表示されます。この表示をみると、ビルドすることによって評価ボード用(gd32vf103v-eval)とLongan Nano(sipeed-longan-nano)の両方のビルドがされるようですボードのgd32vf103v-evalの定義を消し忘れてました。ちなみに、ソースコードは左側のツリーのsrcの下にBlink.cppがありますので、そこで確認できます。

Longan NanoをPCに接続し、Longan NanoのBOOT0ボタンを押しながらRESETを押して(離して)、BOOT0ボタンを離すと書き込み準備ができているはず・・・・です。(要はLongan Nanoが動作を始める瞬間=RESETが離される瞬間にBOOT0が押されていればOK)

①のチェックマークを押すと書き込みが始まります。しばらく画面が流れますが、最終的に②のようにFAILEDという表示が出るのですが、LEDは赤色で点滅を始めます。ソースコードのdelay()のパラメータを変えると周期も変わりますので、書き込みはできています。

とりあえず、ギリギリ書き込みもできて、Lチカまで到達しましたが、まだまだの感じです。

> Executing task in folder 191104-010453-arduino-blink: platformio run --target upload < Processing gd32vf103v-eval (platform: gd32v; framework: arduino; board: gd32vf103v-eval) -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Verbose mode can be enabled via `-v, --verbose` option CONFIGURATION: https://docs.platformio.org/page/boards/gd32v/gd32vf103v-eval.html PLATFORM: GigaDevice GD32V 1.1.0 > GD32VF103V-EVAL
HARDWARE: GD32VF103VBT6 108MHz, 32KB RAM, 128KB Flash
DEBUG: Current (altera-usb-blaster) External (altera-usb-blaster, gd-link, jlink, rv-link, sipeed-rv-debugger, um232h)
PACKAGES: toolchain-gd32v 9.2.0, tool-openocd-gd32v 0.1.1, tool-gd32vflash 0.1.0, framework-arduino-gd32v 0.1.1
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Checking size .pio/build/gd32vf103v-eval/firmware.elf
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [=         ]   7.2% (used 2358 bytes from 32768 bytes)
PROGRAM: [=         ]   6.3% (used 8250 bytes from 131072 bytes)
Configuring upload protocol...
AVAILABLE: altera-usb-blaster, gd-link, jlink, rv-link, serial, sipeed-rv-debugger, um232h
CURRENT: upload_protocol = gd-link
Uploading .pio/build/gd32vf103v-eval/firmware.elf
openocd: error while loading shared libraries: libftdi.so.1: cannot open shared object file: No such file or directory
*** [upload] Error 127
=============================================================================================== [FAILED] Took 1.33 seconds ===============================================================================================

Processing sipeed-longan-nano (platform: gd32v; framework: arduino; board: sipeed-longan-nano)
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Verbose mode can be enabled via `-v, --verbose` option
CONFIGURATION: https://docs.platformio.org/page/boards/gd32v/sipeed-longan-nano.html
PLATFORM: GigaDevice GD32V 1.1.0 > Sipeed Longan Nano
HARDWARE: GD32VF103CBT6 108MHz, 32KB RAM, 128KB Flash
DEBUG: Current (altera-usb-blaster) External (altera-usb-blaster, gd-link, jlink, rv-link, sipeed-rv-debugger, um232h)
PACKAGES: toolchain-gd32v 9.2.0, tool-openocd-gd32v 0.1.1, tool-gd32vflash 0.1.0, framework-arduino-gd32v 0.1.1
LDF: Library Dependency Finder -> http://bit.ly/configure-pio-ldf
LDF Modes: Finder ~ chain, Compatibility ~ soft
Found 0 compatible libraries
Scanning dependencies...
No dependencies
Checking size .pio/build/sipeed-longan-nano/firmware.elf
Memory Usage -> http://bit.ly/pio-memory-usage
DATA:    [=         ]   7.2% (used 2358 bytes from 32768 bytes)
PROGRAM: [=         ]   6.3% (used 8250 bytes from 131072 bytes)
Configuring upload protocol...
AVAILABLE: altera-usb-blaster, dfu, gd-link, jlink, rv-link, serial, sipeed-rv-debugger, um232h
CURRENT: upload_protocol = dfu
Uploading .pio/build/sipeed-longan-nano/firmware.bin
dfu-util 0.9

Copyright 2005-2009 Weston Schmidt, Harald Welte and OpenMoko Inc.
Copyright 2010-2016 Tormod Volden and Stefan Schmidt
This program is Free Software and has ABSOLUTELY NO WARRANTY
Please report bugs to http://sourceforge.net/p/dfu-util/tickets/

dfu-util: Invalid DFU suffix signature
dfu-util: A valid DFU suffix will be required in a future dfu-util release!!!
Opening DFU capable USB device...
ID 28e9:0189
Run-time device DFU version 011a
Claiming USB DFU Interface...
Setting Alternate Setting #0 ...
Determining device status: state = dfuERROR, status = 10
dfuERROR, clearing status
Determining device status: state = dfuIDLE, status = 0
dfuIDLE, continuing
DFU mode device DFU version 011a
Device returned transfer size 2048
GD32 flash memory access detected
Device model: GD32VF103CB
Memory segment (0x08000000 - 0801ffff)(rew)
Erase size 1024, page count 128
Downloading to address = 0x08000000, size = 8268
Download        [=========================] 100%         8268 bytes
Download done.
File downloaded successfully
dfu-util: dfuse_download: libusb_control_transfer returned -4
*** [upload] Error 74
=============================================================================================== [FAILED] Took 3.85 seconds ===============================================================================================

Environment         Status    Duration
------------------  --------  ------------
gd32vf103v-eval     FAILED    00:00:01.327
sipeed-longan-nano  FAILED    00:00:03.853
========================================================================================= 2 failed, 0 succeeded in 00:00:05.180 =========================================================================================
The terminal process terminated with exit code: 1

Terminal will be reused by tasks, press any key to close it.

出力を見ると、いくつか課題が見えます。

  • 書き込みも評価ボードにも行おうとして失敗していること(まあ、これはいいでしょう)
  • (Linux版の)DFUはGD32VF103には未対応であること

がわかります。

・・・・そのうち、八百万の神々によって改善されることでしょう(他力本願・・^^;)

Longan Nano情報源

Longan Nanoについての情報をメモっておきます。

Longan Nanoの開発環境をLinux環境にインストール

秋月にLongan Nanoというボードが入荷していたので買ってきました。簡単に言うと、俗に(かな?)BluePillというSTM32F103C8が載った格安のボード(AliExpressで2ドル以下)がありますが、このボードのCPUをGD32VF103というGigaDeviceという会社のRISC-Vチップに置き換えて、小型のカラーIPS液晶(見た目の雰囲気はOLEDっぽいのですが???)と(写真にはありませんが)MicroSDスロットを追加した感じの仕様のものです。USBのコネクタは今時らしくType-Cになっています。
そして、嬉しいことに、これだけの仕様で秋月で830円という激安価格で売っています。

で、写真は公式サイトにあるBadAppleのデモを動かしたものです。(残念ながら、Linux環境ではDFUでのダウンロードがうまく行かず、こちらの記事に従ってWindows環境でファーム書き込みしました)

引き続き、開発環境を構築してみます。環境はいつものLinuxMintです。

公式サイトの製品Wikiによると、longan nanoの開発はPlatformIO IDEで行います。

ここでは公式サイト内のGETTING STARTEDにある手順に沿って開発環境を整えてみます。

幸い、以前、PlatformIOは試してみているので、VScodeのインストールや、PlatformIO(PIOと略されている)のインストールは省いて、GD32Vのplatformの定義のインストールから行います。作業は現時点ではコマンドラインとGUIと両方必要なようです。

一番左のPlatformIOのロゴ(宇宙人みたいなやつ)をクリックして表示されるQUICK ACCRESSの中の「New Terminal」をクリックします。
すると、新しいターミナルのペインが開くので、そこで。

$ platformio platform install gd32v

と入力してインストールします。

$ platformio platform install gd32v
PlatformManager: Installing gd32v
gd32v @ 1.1.0 has been successfully installed!
PackageManager: Installing toolchain-gd32v @ ~9.2.0
Downloading [####################################] 100% 
Unpacking [####################################] 100% 
toolchain-gd32v @ 9.2.0 has been successfully installed!
The platform 'gd32v' has been successfully installed!
The rest of packages will be installed automatically depending on your build environment.

完了したら、GUIでの作業です。

QUICK ACCRESSの中の「Open」をクリックします。
次にPIO HomeタブのPlatformsをクリック、開いたページの中の「Advanced Installation」をクリック、

開いたダイアログで

https://github.com/sipeed/platform-gd32v.git

を入力してインストールをクリックします。

こんな感じになれば成功です。

あと、USBデバイスとして認識できるようにしておきます。

$ curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core/master/scripts/99-platformio-udev.rules | sudo tee /etc/udev/rules.d/99-platformio-udev.rules
$ sudo nano /etc/udev/rules.d/99-gigadevice-udev.rules

として、udevのルールを用意します。1つ目はPlatformIOの推奨のファイルをダウンロードしてきます。2つ目はGigaDevice GD32VF103用の内容を用意します。(PlatformIOには存在しないため)

# Longan Nano
ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666"

作成したら、認識させておきます。

$ sudo udevadm control --reload-rules
$ sudo udevadm trigger

つづく

GitHubを使ってみた

これまでソースコードは自宅内サーバ上に保管していたのですが、いつもぐちゃぐちゃでわけがわからなくなっているので、GitHubのプライベートリポジトリを利用してみることにしました。

公式のチュートリアルで理解できたことは以下の通り。

1.リポジトリを作る。masterブランチが神様

統合開発環境で最初にプロジェクトを作る、というのとほぼ同じ意味だろうか。
これまで「masterってなんだろう?」と思いながら git clone していたのが理解できた。

2.一時的なブランチを作る

一時的に改変して試す環境を作る、くらいの感じだろうか。ブランチを選択するドロップダウンメニュー(のようなもの)にある「Switch branches/tags」に新しいブランチの名称を入れる。

3.作成したブランチを編集してデバッグなどを行う

チュートリアルではブラウザ上で編集できるファイルを編集しているので、ローカルで編集・デバッグする必要のあるファイルの操作方法は別途調べないといけない。
編集したら、commt changesで改変内容を commit する。

4.Pull Requestを作成する

たぶん、「masterブランチにとりこんでね!」という要求。チュートリアルだとどちらも自分なのでわかりにくい概念だけど。

5.(masterブランチ宛ての)Pull Requestをマージする

Merge pull request ボタンを押して、変更点をmasterブランチに取り込む

6.一時的なブランチを削除する

 

こんな感じかな??

pyftdiでI2C通信

pyftdiでI2Cデバイスをつなげてみました。

接続したデバイスは昔秋月で買ったLPS331使用の大気圧センサモジュールです。

回路はこんな感じ。

右側のがLPS331使用の大気圧センサモジュール。真ん中のLEDは使用していません。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

from os import environ
import sys
from pyftdi.i2c import I2cController
from time import sleep

class LPS331(object):
    """
    """

    def __init__(self):
        self._i2c = I2cController()

    def open(self):
        url = environ.get('FTDI_DEVICE', 'ftdi://ftdi:232h/1')
        self._i2c.configure(url,frequency=400000)
        self._port = self._i2c.get_port(0x5c)

    def close(self):
        pass

    def init(self):
        port = self._port
        port.write([0x10,0x6A])		# Pres Average 512 / Temp Average 64
        port.write([0x20,0xF4])		# ODR=25Hz、BDU=1
    
    def read(self):
        port = self._port
        out1 = port.exchange([0x08],1)
        out2 = port.exchange([0x09],1)
        out3 = port.exchange([0x0a],1)
        refp = (out1[0] + out2[0]*256 + out3[0]*65536)/4096.0
        out1 = port.exchange([0x28],1)
        out2 = port.exchange([0x29],1)
        out3 = port.exchange([0x2a],1)
        pres = (out1[0] + out2[0]*256 + out3[0]*65536)/4096.0
        out1 = port.exchange([0x2b],1)
        out2 = port.exchange([0x2c],1)
        out = (out1[0] + out2[0]*256) 
        if out >= 0x8000 : out -= 0x10000
        temp = 42.5 + out/480.0
        return(refp,pres,temp)
        
if __name__ == '__main__':
    lps331 = LPS331()
    lps331.open()
    lps331.init()
    while True:
        (refp,pres,temp) = lps331.read()
        print(refp,pres,temp)
        sleep(1)

実行すると

$ python ftdi-lps331.py 
0.0 1012.830078125 27.485416666666666
0.0 1012.68212890625 27.504166666666666
0.0 1012.84716796875 27.525
0.0 1012.838134765625 27.508333333333333
0.0 1012.654296875 27.541666666666664
0.0 1012.570556640625 27.53125

という感じで気圧と気温を取得できました。

これでデスクトップPCでもI2Cデバイスの評価などができて便利そうです。