Zig × Arduino UnoでLチカ・シリアル通信できた件

Zig言語でArduino UNOのLチカ、シリアル通信が確認できた、という記事です。

Zig

Zigについてはこちらをどうぞ。

Home ⚡ Zig Programming Language

ベースのソースコード

こちらのソースコードで確認させていただきました。

GitHub - FireFox317/avr-arduino-zig: Arduino using Zig!

ハードウェア確認環境

Arduino UNO

ソフトウェア確認環境

こちらのmasterリリース 2021-04-20版を使いました。

Download ⚡ Zig Programming Language

ホストPCはMacなので【zig-macos-x86_64-0.8.0-dev.1983+e2cc02717.tar.xz】をダウンロードしました。

環境構築

ダウンロードしたZigコンパイラを解凍し、パスを追加します。

echo "export PATH=/Users/k-abe/zig-macos-x86_64-0.8.0-dev.1983+e2cc02717/zig:\$PATH" >> ~/.bash_profile

パスを読み込みます。

source ~/.bash_profile

zigのコンパイラにパスが通っているか確認します。


KojinoMacBook-2:~ k-abe$ zig version
0.8.0-dev.1983+e2cc02717

ダウンロードしたバージョンと同じバージョンが読み出せたのでパスは通りました。

ビルド

ベースソースコードディレクトリに移動し(build.zigがある階層に移動)、ビルドします。


KojinoMacBook-2:~ k-abe$ cd /Users/k-abe/Documents/zig_work/avr-arduino-zig/
KojinoMacBook-2:avr-arduino-zig k-abe$ zig build
KojinoMacBook-2:avr-arduino-zig k-abe$ ls
LICENSE     README.md   build.zig   src     zig-cache

zig-cacheディレクトリ以下にelfファイルが出力されます。

f:id:gracehime:20210420224859p:plain
実行ファイル出力先

出力されたファイルをfileコマンドで確認してみます。

うん。elfファイルですね。


KojinoMacBook-2:avr-arduino-zig k-abe$ file /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig
/Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped

書き込み

elfファイルができたのでArduino UNOに書き込み、動作を確認してみます。

Arduino UNOとPCをUSBケーブルで接続します。

書き込みの際に必要なのでデバイス名を下記のコマンドで取得します。


KojinoMacBook-2:avr-arduino-zig k-abe$ ls /dev/cu.usb*
/dev/cu.usbmodem141401

書き込みツールavrdudeで書き込みます。


KojinoMacBook-2:avr-arduino-zig k-abe$ avrdude -patmega328p -carduino -P/dev/cu.usbmodem141401 -b115200 -D -Uflash:w:/Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig:e

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "/Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig"
avrdude: writing flash (1048 bytes):

Writing | ################################################## | 100% 0.18s

avrdude: 1048 bytes of flash written
avrdude: verifying flash memory against /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig:
avrdude: load data flash data from input file /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig:
avrdude: input file /Users/k-abe/Documents/zig_work/avr-arduino-zig/zig-cache/bin/avr-arduino-zig contains 1048 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.15s

avrdude: verifying ...
avrdude: 1048 bytes of flash verified

avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.

正常に書き込めたようなので動作確認してみます。

動作確認

ベースソースコードはLチカとシリアルデータ送信をおこなっています。

シリアルターミナルでArduinoに接続します。シリアルターミナルはminicomを使いました。ビットレートは115200を指定しています。

KojinoMacBook-2:avr-arduino-zig k-abe$ minicom -D /dev/cu.usbmodem141401 -b 115200

f:id:gracehime:20210420230656j:plain
シリアルデータ表示

起動時のシリアルメッセージ、!から~までのASCIIコード、Lチカが確認できました。

確認内容とソースコード/src/main.zigの処理内容が同じことを確認できました。

感想

Zig・Arduino UNOでもLチカ・シリアル通信を確認できました。

最近はRust学習を始めたこともありRustのコードを多くみていましたが下記が違うと思いました。

  • メモリ管理

Zigのベースソースコードはmain関数内部でグローバル変数chをインクリメントしシリアルデータとして送信しています。

Rustではグローバル変数をunsafeで括らないとビルドエラーになってしました。

ZigはRustほどメモリ管理に厳密ではないのだなぁ、と思いました。

良いのか悪いかは置いておいて、ZigはC言語経験者がそれほど違和感なく使え、学べるかもしれないと思いました。

最後まで読んでいただいてありがとうございました。

LeafonyをRustで動かせたので情報共有です

この記事の内容です。

  • LeafonyのBasic KitがRustで動いた。

  • Lチカできた

  • シリアル通信できた

  • I2C通信できた

最近、Rustの学習をArduinoではじめました。 もう少しで書籍:基礎から学ぶ-組込みRustも発売されますし、今、組み込みRustが熱い、と個人的に思っています。

基礎から学ぶ 組込みRust | 中林 智之, 井田 健太 |本 | 通販 | Amazon

Rust、組み込みRustに興味ある方になにか参考になれば嬉しいです。 それではLet's Rust!!!

対象読者

  • Rust、組み込みRust初学者

  • Rustで動くIoTエッジデバイスはないかな?と思っている方

Leafonyとは何か?

Leafonyについてはこちらを参照ください。 docs.leafony.com

小型の可愛らしい基板(リーフと呼ばれる)をスタックしていくことで機能を自由に組み合わせ可能なデバイスです。 これです。

f:id:gracehime:20210414071036j:plain
Leafonyの写真

Basic Kitはケース付きです。何気に嬉しい・痒いところに手が届く・重宝します!!!

IoTのエッジが簡単に出来ると謳われています。 制御マイコンArduino Unoと同じATmega328PまたはESP32です。 この記事はATmega328PでRustを動かしました。

なぜターゲットをLeafonyにしたのか?

1年前にelchikaさんのキャンペーンでLeafonyのキットが当選し手元にあったこと、最近ArduinoでRustを学び始めていたからです。

elchika.com

LeafonyのBasic Kitでは次の基板から構成されており色々試行錯誤できるかも・・・と思ったことも理由です。 docs.leafony.com

Bluetooth、温度・湿度・照度・加速度センサなどのリーフで構成されています。

Basic Kitのサンプルプログラムはこちらでも紹介されています。 docs.leafony.com

開発環境

ベースにしたソースコード

ソースコードはこちらをベースにさせてもらいました。

github.com

ホスト環境

WSL 1。Ubuntu-20.04で確認。

※かなり変則的ですがMacbook ParallelsでWindows10 64bitをゲストOSにしています。 ゲストOSのWindows10にWSL, Ubuntu-20.04を導入し、そこにRustをインストールしました。

Rustのバージョン

インストールしたバージョンは次の通りです。

k-abe@KOJIABEC31D:~/avr-rust/leafony_rust$ rustup show
Default host: x86_64-unknown-linux-gnu
rustup home:  /home/k-abe/.rustup

installed toolchains
--------------------

stable-x86_64-unknown-linux-gnu (default)
nightly-2021-01-07-x86_64-unknown-linux-gnu
nightly-x86_64-unknown-linux-gnu

active toolchain
----------------

stable-x86_64-unknown-linux-gnu (default)
rustc 1.50.0 (cb75ad5db 2021-02-10)

ただし、こちらのREADMEに記載あるようにnightly-2021-01-07をインストールしビルドしています。 github.com

試したこと

ソースコードはこちらに置きました。 github.com

今回、ベースのソースコードから変更したのは次の2つのソースコードです。

  1. boards/arduino-uno/examples/Battery_Voltage.rs 次のLeafonyのバッテリ電圧読み取りサンプルプログラム相当をRustで書いてみました。 docs.leafony.com I2Cでバッテリ電圧読み取り、バッテリ電圧をシリアル通信で送信、1秒間隔でLED点滅しています。

  2. boards/arduino-uno/src/lib.rs ベースのソースコードArduino unoでクロックは16MHzです。 Leafonyの制御マイコンArduino Unoと同じATmega328Pですがクロックは8MHzです。 シリアル送信、I2C、Delay関数は16MHz設定となっているので8MHzに変更します。

具体的な変更内容はこちらを参照ください。 github.com

LeafonyオリジナルサンプルコードとRustで少し実装の違いがあります。

  • i2Cのリード  Leafony Basic Kitに同梱されている【AV01 CR2032】リーフのバッテリ電圧を読み取ります。 docs.leafony.com

 ソースコード先頭の

const BATT_ADC_ADDR: u8 = 0x50;

 はAV01 CR2032リーフに実装されているADコンバータADC081C027CIMKのI2Cアドレスです。ATmega328Pがマスター、ADコンバータがスレーブです。

 Rust版はi2Cのリードでデータ長を指定していません。あまりよく理解できていませんが引数にスライス(?)を指定しています。

     i2c.read(BATT_ADC_ADDR, &mut receive_buffer[0..2]);

 正しいのかどうか確信がないですが後述の理由で一応、このコードでバッテリ電圧を読めているようです。

 オリジナル版 i2Cリード処理の抜粋


  Wire.requestFrom(BATT_ADC_ADDR,2);
  uint8_t adcVal1 = Wire.read();
  uint8_t adcVal2 = Wire.read();

  • キャスト  Rust版は【as u32】キーワードでキャストしています。
     let temp_millivolt = ( ( (receive_buffer[0] << 4) | (receive_buffer[1] >> 4) ) as u32 * 3300 * 2) / 256; 

 オリジナル版

double tempMillivolt = ((double)((adcVal1 << 4) | (adcVal2 >> 4)) * 3300 * 2) / 256;

  • シリアル送信データのフォーマット

オリジナルのサンプルプログラムは浮動小数点のフォーマットでシリアルデータ送信していますが、Rust版では整数としています。

Rustでもオリジナルと同じようにしたかったのですがコンパイルエラーを解消することができなかったので整数にしました。

ビルド

ビルドはREADMEの通りにしました。

k-abe@KOJIABEC31D:~/avr-rust/avr-hal_fork_add_leafony/boards$ cd arduino-uno/
k-abe@KOJIABEC31D:~/avr-rust/avr-hal_fork_add_leafony/boards/arduino-uno$ cargo +nightly-2021-01-07 build --example Battery_Voltage
   Compiling arduino-uno v0.1.0 (/home/k-abe/avr-rust/avr-hal_fork_add_leafony/boards/arduino-uno)
warning: crate `Battery_Voltage` should have a snake case name
  |
  = note: `#[warn(non_snake_case)]` on by default
  = help: convert the identifier to snake case: `battery_voltage`

warning: unused `core::result::Result` that must be used
  --> boards/arduino-uno/examples/Battery_Voltage.rs:35:6
   |
35 |         i2c.write(BATT_ADC_ADDR, &adc_hedder);
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(unused_must_use)]` on by default
   = note: this `Result` may be an `Err` variant, which should be handled

warning: unused `core::result::Result` that must be used
  --> boards/arduino-uno/examples/Battery_Voltage.rs:38:3
   |
38 |         i2c.read(BATT_ADC_ADDR, &mut receive_buffer[0..2]);
   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: this `Result` may be an `Err` variant, which should be handled

warning: 3 warnings emitted

    Finished dev [optimized + debuginfo] target(s) in 21.45s

warningがでています。 良くないですが無視しました。 戻り値を処理してね、というwarningのようです。

elfからhexファイルを作成

WSLからLeafonyに書き込みできないよなと思ったのでWindowsから書き込みを行います。 書き込みは書き込みツールavrdudeの64bit版を使いました。 avrdudeはelfファイルでも書き込みできるだろうと思っていましたができませんでした。 そのため、ビルドでできたelfファイルからhexファイルを作成し、avrdudeで書き込みました。

次がelfからhexファイル作成コマンドです。

k-abe@KOJIABEC31D:~/avr-rust/avr-hal_fork_add_leafony/boards/arduino-uno$ avr-objcopy -S -j .text -j .data -O ihex ../../target/avr-atmega328p/debug/examples/Battery_Voltage.elf ../../target/avr-atmega328p/debug/examples/Battery_Voltage.hex

書き込み

avrdudeでhexファイルを書き込みます。 Windowsコマンドプロンプトを起動し、avrdudeがあるフォルダに移動します。 次のコマンドを実行し、hexファイルを書き込みます。

Z:\Documents\avr\avrdude-64>avrdude -carduino -PCOM5 -b 57600 -patmega328p -D -U flash:w:Battery_Voltage.hex:i

avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.05s

avrdude: Device signature = 0x1e950f (probably m328p)
avrdude: reading input file "Battery_Voltage.hex"
avrdude: writing flash (1848 bytes):

Writing | ################################################## | 100% 2.61s

avrdude: 1848 bytes of flash written
avrdude: verifying flash memory against Battery_Voltage.hex:
avrdude: load data flash data from input file Battery_Voltage.hex:
avrdude: input file Battery_Voltage.hex contains 1848 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.88s

avrdude: verifying ...
avrdude: 1848 bytes of flash verified

avrdude: safemode: Fuses OK (E:00, H:00, L:00)

avrdude done.  Thank you.

気をつけることはhexファイル書き込みのためコマンドラインの末尾が【i】になることです。 ※elfファイルの場合は【f】。

次のサイトを参考にさせていただきました。 synapse.kyoto

動作確認

書き込みが終了したら下図のようにLeafonyとPCをUSBケーブルで接続します。

f:id:gracehime:20210414070717j:plain
LeafonyとPCとの接続

Teratermなどのシリアルターミナルを起動し、通信条件を下図に設定します。

f:id:gracehime:20210414065712p:plain
Leafonyシリアル通信条件の設定

そうするとシリアルターミナルにバッテリ電圧が表示されます。 電源リーフのスイッチをONにするとバッテリ電圧が読み取りできます。

f:id:gracehime:20210414074817j:plain
シリアルターミナルのバッテリ電圧表示

非Rust版のLeafonyオリジナルのバッテリ電圧読み取りサンプルプログラムを動かしたところ、バッテリ電圧のシリアルデータ表示は次のようになりました。

  • 電源リーフのスイッチオフ時:0.05

  • 電源リーフのスイッチオン時:2.91

Rust版では電源リーフのスイッチオン時:2964でした。1000で割り小数点形式だと2.964Vになります。

非Rust版のサンプルプログラムとRust版で近い値となっているのでI2Cでバッテリ電圧を読めていると判断できそうです。

最後に

長い文章を最後まで読んでいただきありがとうございました。 Rustをはじめようと思っている方、Rustで動くIoTエッジデバイスを探している方のヒントになれば嬉しいです。

2020年のアクティビティを振り返る

LAPRASさんの「ACTIVITY LOG 2020:2020年のアクティビティを振り返ろう」で自身の活動の振り返りをしてもらいました。

2020年のアウトプットと参加イベントを振り返ると

今年アウトプットしたものや参加したイベントなどをまとめてみました。

Github

connpass

LAPRASポートフォリオはこちらから

技術書典10で「GCC開発環境構築入門(EVカート編)」を頒布します

最近は12/26から開催される技術書典10向けに技術書を書いていました。 techbookfest.org

昨日(12/24)、ついに本が完成しました。 techbookfest.org

  • 本のタイトル:GCC開発環境構築入門(EVカート編)

  • サークル名:k-abe

今回はこの技術書について紹介したいと思います。

なんの本か?

本のタイトル通りですが、GCC開発環境を構築した話です。 対象ハードウェアはCQ出版社より販売されているEVカートです。

組込みソフトウェアで、プログラミング言語C言語です。 GCC開発環境構築後、既存ソースコードGCC開発環境向けに変更した内容も書きました。

書いた理由は?

EVカートの既存ソフトウェアはルネサスエレクトロニクス社の統合開発環境+ソースコード自動生成ツールで開発していました。 私の学習目的でGCCへの開発環境移行にチャレンジしてみたかったのでしてみました。 開発環境構築する際の手順、はまったことなどを共有すれば誰かの役にたつかも・・・と思ったことが理由です。

本の紹介

本のページを少し紹介していきます。

表紙

表紙です。

f:id:gracehime:20201225165544p:plain

本のタイトル、サークル名は次のとおりです。是非、お忘れなきように・・・。

  • 本のタイトル:GCC開発環境構築入門(EVカート編)

  • サークル名:k-abe

前回の技術書同様(https://k-abe.hatenablog.com/entry/techbookfest-9/evkartmbd)、味気ない表紙です。今回もこんな感じでいきます。 いつか格好いい表紙をつくる!!!

前書き

前書きです。

f:id:gracehime:20201225170331p:plain

ここに「この本を書いた自分の正直な思い」を書きました。

「開発環境構築に何度も失敗し虚無感を感じた」の前後です。

ここに共感いただけるエンジニアの方もいるのでは???、と個人的に思っています。

目次

目次です。

f:id:gracehime:20201225171814p:plain

前半は次の内容を書いています。

  • 統合開発環境GCC開発環境との比較

  • GCC開発環境構築の手順

  • GCC開発環境構築の手順でハマったところ

f:id:gracehime:20201225171839p:plain

後半はGCC開発環境構築した後の話です。GCCで開発するために必要になった変更点を書いています。 統合開発環境GCCでは一体何が違うのか?、気になった方は是非、見てください。

はじめに

開発対象のEVカートについて簡単に説明しています。

f:id:gracehime:20201225172158p:plain

最後に

紹介は以上になります。 如何でしたでしょうか?少し興味が湧いたでしょうか? 気になった方は(そうでない方も)是非、試しに読んでみてください。

ソフトウェア開発の最初の壁とも言える開発環境構築に自分なりに迫って書きました。 本書が興味を持って読んでくださった方になにか役立てば嬉しいです。

以上になります。最後まで読んでいただきありがとうございました。

CQ EVカート開発環境をCS+からGCCに移行した話

こんばんは。k-abeです。 私、技術書1でも書いていますがCQ出版社より販売されているEVカート改造し、組込みソフトウェアのスキルアップを考えています。
デフォルトのEVカートのソフトウェア開発環境はルネサスエレクトロニクス社のCS+で、ソースコード自動生成ツールApplilet2 for V850ES/Fx3を使っています(制御マイコンはV850ES/FG3)。
今回、CS+からGCCに開発環境を移行できたので備忘録として残しておこうと思います。
※何故、CS+からGCCに開発環境を移行した背景・理由は次の資料8, 11スライド目を見ていただければと思います。

www.slideshare.net

開発環境は次のツールをインストールします。

  • MSYS2, make

  • make

  • V850ツールチェイン

ツールをインストールしたホストPCの条件

  • Windows 8.1 64bit (多分Windows10でも大丈夫だと思います)

MSYS2, makeのインストール

MSYS2のインストール

次のページからmsys2-x86_64-20200903.exeをダウンロード・実行します。 www.msys2.org

↑のリンク先の手順通りにインストール・パッケージの更新を実行します。

makeのインストール

パッケージ更新が終了したらmakeをインストールします。
下記コマンドを実行します。
インストールするか?と聞かれるのでyを入力します。

$ pacman -S make
resolving dependencies...
looking for conflicting packages...

Packages (1) make-4.3-1

Total Download Size:   0.45 MiB
Total Installed Size:  1.48 MiB

:: Proceed with installation? [Y/n] y
:: Retrieving packages...

インストールが始まります。

make-4.3-1-x86_64     456.7 KiB   541 KiB/s 00:01 [#####################] 100%
(1/1) checking keys in keyring                     [#####################] 100%
(1/1) checking package integrity                   [#####################] 100%
(1/1) loading package files                        [#####################] 100%
(1/1) checking for file conflicts                  [#####################] 100%
(1/1) checking available disk space                [#####################] 100%
:: Processing package changes...
(1/1) installing make                              [#####################] 100%
:: Running post-transaction hooks...
(1/1) Updating the info directory file...

インストールが終わったらmakeがインストールできているかバージョン表示で確認してみます。

$ make -ver
GNU Make 4.3
Built for x86_64-pc-msys
Copyright (C) 1988-2020 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later 
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

make 4.3がインストールできました。

V850ツールチェインのインストール

次のページからGNUV850 v14.01 Windows Toolchain (ELF)をダウンロードします。
※ダウンロードするためにはユーザ登録が必要です。

https://gcc-renesas.com/ja/v850/v850-download-toolchains/

ダウンロードしたインストーラを実行します。すべてインストーラのデフォルト設定のままインストールを進めます。

f:id:gracehime:20201207072355p:plain

f:id:gracehime:20201207072555p:plain

この画面になったら登録メールアドレス、アクティベーションコードを入力します。 f:id:gracehime:20201207072710p:plain

アクティベーションコードは次のメニューから確認できます。
ツールチェインをダウンロードしたサイトに移動し、GNU Tools -> ダッシュボード を選択します。

f:id:gracehime:20201207075824p:plain

Your legacy*** のactivation codeを確認します(図の点線枠内部分)。 f:id:gracehime:20201207080343p:plain

確認したアクティベーションコードを入力し、Nextボタンを押下します。

Next f:id:gracehime:20201207080814p:plain

Yes f:id:gracehime:20201207080904p:plain

Next f:id:gracehime:20201207080752p:plain

このままNext f:id:gracehime:20201207080950p:plain

Next f:id:gracehime:20201207081019p:plain

Next f:id:gracehime:20201207081047p:plain

インストールが開始される。 f:id:gracehime:20201207081112p:plain

インストール中... f:id:gracehime:20201207081155p:plain

Next f:id:gracehime:20201207081225p:plain

Finishでインストール完了。 f:id:gracehime:20201207081251p:plain

このままではコンパイルできないことがわかったので以下の設定を行う。

環境変数を開く。

f:id:gracehime:20201207165451p:plain

  • ユーザー環境変数Pathにツールチェイン実行ファイルのパスを追加する。
    ツールチェイン実行ファイルのパス:C:\Program Files (x86)\KPIT\GNUV850v14.01-ELF\v850-elf\bin

  • ユーザー環境変数に下記を追加する。 f:id:gracehime:20201207165528p:plain

MSYSを終了し、サインアウト→サインインする。その後、MSYSを起動し(スタートメニューからMSYS2 64bit -> MSYS2 MSYSのバッチファイルを選択)、gccのバージョンを確認する。

$ v850-elf-gcc -v
Using built-in specs.
COLLECT_GCC=c:\Program Files (x86)\KPIT\GNUV850v14.01-ELF\v850-elf\bin\v850-elf-gcc.exe
COLLECT_LTO_WRAPPER=c:/program\ files\ (x86)/kpit/gnuv850v14.01-elf/v850-elf/bin/../libexec/gcc/v850-elf/4.9-GNUV850_v14.01/lto-wrapper.exe
Target: v850-elf
Configured with: /home/kpit/fsfsrc/elf-v14.01-src-v850/gcc-4.9.2/configure --disable-shared --build=i686-pc-linux-gnu --host=i386-pc-mingw32msvc --enable-languages=c,c++ --target=v850-elf --with-newlib --with-gmp=/home/vinayk/utilities/mingw_gmp_mpfr/prefix/ --with-mpfr=/home/vinayk/utilities/mingw_gmp_mpfr/prefix/ --with-mpc=/home/vinayk/utilities/mingw_gmp_mpfr/prefix/ --prefix=/usr/share//mingwgnuv850_v14.01_elf-1 --disable-libstdcxx-pch --with-pkgversion=GCC_Build_2.01
Thread model: single
gcc version 4.9-GNUV850_v14.01 (GCC_Build_2.01)

gccのバージョンを確認できました。

makeの動作確認

git hubからソースコードを取得する。

github.com

Codeボタン -> Download ZIPを選択し、ソースコードをダウンロードする。
※もちろん、gitクライアントから取得してもOK。
f:id:gracehime:20201207171725p:plain

取得したファイルをC:\msys64\home\ユーザ名 などに解凍する。
解凍したディレクトリ(Makefileがあるディレクトリ)に移動する。

$ cd cq-ev-kart-gcc/

makeを実行する。

$ make
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  start.S
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  main.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  interrupt_vector.S
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  interrupt.S
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  nop_interrupt.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  clock.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  system_init.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  port.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  e1_debug_memory_alloc.S
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  timer.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  ad.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  motor.c
v850-elf-gcc -c   -mv850e -mdisable-callt -g -Wall -O2   -I.  serial.c
v850-elf-gcc   -mv850e -mdisable-callt -g -Wall -O2   -I.   -nostartfiles -lgcc -lc -msoft-float -T v850fg3.ld -o cq-ev-kart start.o main.o interrupt_vector.o interrupt.o nop_interrupt.o clock.o system_init.o port.o e1_debug_memory_alloc.o timer.o ad.o motor.o serial.o
v850-elf-nm -n cq-ev-kart > cq-ev-kart.syms
v850-elf-objcopy -O srec -S cq-ev-kart cq-ev-kart.srec

オブジェクトファイル(*.o)、ELF形式のファイルcq-ev-kart、モトローラSレコード形式の書き込みファイル(cq-ev-kart.srec)などができる。

make cleanを実行でオブジェクトファイルを削除できる。

$ make clean
rm -f *.o
rm -f cq-ev-kart cq-ev-kart.syms cq-ev-kart.srec

cq-ev-kart.srecをフラッシュプログラマで書き込み、CQ EVカートのモータを回すことができた。

もっと簡単に環境構築するには???

今回はWindows+MSYSにツールチェインをインストールしました。
インストールした後に発見したのですが今回インストールしたツールチェインのコンテナがありました。

https://hub.docker.com/r/mikoto2000/v850-toolchain

上記コンテナはLinuxで動かすようですが、もしLinuxかWindows10にWSLを構築済みであればこちらのコンテナを試してみるのに良いかもしれません。

今回はこれで終わりです。読んでいただきありがとうございました。

Re:VIEW 5.0の環境構築をDockerでできた件

こんにちは。年末の技術書典10に向けて執筆活動をスタートしようとしています。

前回の技術書典9はRe:VIEW 4.0で書きました。 年末の技術書典10の環境を構築しようと考えていましたが、少し前にRe:VIEW 5.0がリリースされていました。 今回の技術書典10もRe:VIEWで書こうと思っていましたがどちらのバージョンを使うか迷っていました。

そんな中、DockerのみでRe:VIEW環境を作るという次のリンクを見つけました。

www.konosumi.net

前回のRe:VIEW環境構築時、割とすんなり環境構築できました。 それでも初めてRe:VIEW環境構築ということで多少時間はかかりました。

リンクでは必要なものはDockerのみとのことなので試してみました。 結果、20〜30分くらいでRe:VIEW5.0の執筆環境が構築できたので情報共有させていただきます。

  • PCの環境:macOS Big Sur バージョン: 11.0.1

  • 前提:Dockerがインストール済み。

  • Re:VIEW環境構築手順:

$ cd /Users/k-abe/Documents/techbookfest/ev_kart_gcc

Re:VIEWのプロジェクトを配置したいフォルダを作成しておき、移動する。

$ docker run  --rm  -v $(pwd):/work  vvakame/review:latest /bin/sh -c "cd /work && review-init ev_kart_gcc"

↑のコマンドを実行する。review-initのうしろはRe:VIEWのプロジェクト名にする。 私の場合はev_kart_gcc

Unable to find image 'vvakame/review:latest' locally
latest: Pulling from vvakame/review
bb79b6b2107f: Pull complete
00f65d2e7f9d: Pull complete
43308151f8cb: Pull complete
a07e8ccbe4e3: Pull complete
d4060e803ca0: Pull complete
2d2fd96c104e: Pull complete
3ca4b9622691: Pull complete
cd591d93a892: Pull complete
aea9ba979130: Pull complete
d34c41bbfc89: Pull complete
79ec33ed230e: Pull complete
651de3999982: Pull complete
094b9b118d52: Pull complete
0cad02711590: Pull complete
Digest: sha256:53718baf4516288bd23f389c51ef06d34a1c6b34c3c453c69c34fc48caa8c15f
Status: Downloaded newer image for vvakame/review:latest

dockerイメージができました。

最初の手順でev_kart_gccフォルダを作成・移動し、そこでコマンドを実行したので、ev_kart_gccフォルダの中にev_kart_gccフォルダをつくってしまった。ちょっとした失敗はこれくらい。

f:id:gracehime:20201202123757p:plain
Re:VIEWプロジェクト作成後

これで環境はできたので次のコマンドを実行し本を出力する。

$ docker run  --rm  -v $(pwd):/work  -v $(pwd)/.texmf-var:/root/.texmf-var  vvakame/review:latest /bin/sh -c "cd /work && review-pdfmaker config.yml"
INFO review-pdfmaker: compiling ev_kart_gcc.tex
WARN review-pdfmaker: ev_kart_gcc.re:1: headline is empty.
WARN review-pdfmaker: ev_kart_gcc.re:1: headline is empty.
INFO review-pdfmaker: uplatex -interaction=nonstopmode -file-line-error -halt-on-error __REVIEW_BOOK__.tex
INFO review-pdfmaker: uplatex -interaction=nonstopmode -file-line-error -halt-on-error __REVIEW_BOOK__.tex
INFO review-pdfmaker: uplatex -interaction=nonstopmode -file-line-error -halt-on-error __REVIEW_BOOK__.tex
INFO review-pdfmaker: dvipdfmx -d 5 -z 9 __REVIEW_BOOK__.dvi

めでたくconfig.ymlと同じ階層にbook.pdfが作成されました。

f:id:gracehime:20201202124746p:plain
PDF出力結果

前回の環境構築より圧倒的に短時間で最新Re:VIEW 5.0の執筆ができるようになりました。 執筆のインフラを整備、情報共有してくださる皆様に感謝です。本当にありがとうございます。

これから年末の技術書典10に向けて本を書いていきます。

猫でもわかる?EV カートが動くワケ

はじめに

技術書でお馴染み「猫でもわかる」シリーズ!!!

今回はうちの子(りく)にEVカートが動くワケを紹介してもらいます。

それではりくさん、お願いします。

 

f:id:gracehime:20200903124013p:plain

 

最後に

EV カートはアイデア次第で機能拡張でき、様々なことが実現できます。
これからもEVカートに関する話題を発信していきたいと考えています。
見ていただいてありがとうございました。

 

f:id:gracehime:20200903125229j:plain


りくさん、ありがとうございました。