はじめてのクラウドソーシング体験記

この記事は何???

先日はじめてクラウドソーシングでプレゼン資料に使う画像をつくってもらいました。 そのときの体験記です。

背景

昨年2021年11月に会社のプレゼン資料の画像作成をクラウドワークスで募集しました。 そのときの経験談を共有すれば誰かの役に立つかもしれない・・・と思ったのでブログに書くことにしました。

どんな画像作成だったのか?

次のコンセプトで画像作成依頼しました。

概要

プレゼン資料に作成画像を貼りつけ、パラパラ漫画風にプレゼンしていくことを想定した。

デザインイメージ

プレゼンのストーリーが【少ない工数で大きな成果を出したこと】をテーマにしている。 少ない工数で大きな成果をだしたこと == 【イカで鯛を釣る】のストーリーをパラパラ漫画風にしたいと考えている。

※本来は【エビで鯛を釣る】だがプレゼンがイカにちなんだ名称のため【イカで鯛を釣る】にした。

デザイン登場人物
  • 男の子
  • イカ
  • 釣り竿
  • 浮き
  • 魚拓の紙
作成イメージ種類
  1. 男の子が鯛を釣り上げた画像 ※イカは描かなくて良いです。躍動感があると嬉しいです。
  2. 男の子が一礼している画像
  3. 男の子が腕組みし頭の上に?マークが浮かんでいる画像
  4. 男の子が釣り竿をかついで歩いている画像
  5. 男の子が腕組みし、唸っている画像
  6. 男の子がイカを釣り針につけている画像
  7. 男の子が海に釣竿を投げた画像
  8. あたりがきて、浮きが海の中に引っ張れる様子 ※男の子も書いてほしいです。
  9. 男の子が鯛の魚拓をとっている画像
  10. 男の子が腕を組み、うなづき、共感している様子の画像
  11. 男の子、イカ、鯛がうなづき、共感している様子の画像 ※男の子は10の画像の流用でお願いします。
  12. 男の子、イカ、鯛が一礼している画像 ※男の子は2の画像の流用でお願いします。

お仕事依頼の文面は次のリンクのようにしました。 crowdworks.jp

どんな画像が出来たのか?

多くの方に画像を提案いただきましたが(予想以上に応募いただいて驚いた)、 まるこめっとさん(@marukomet_blog)の画像を採用させていただきました。

twitter.com

作成イメージと画像を掲載します。

※まるこめっとさんからブログ掲載許可はいただいています。

どれも可愛いらしい、素敵な画像でひと目見て気にいりました。

また依頼するときに要件を少し細かく指定させていただいたこともあってかストーリー性があり、 今回のプレゼン以外でも使えそうな汎用的な画像が出来て非常に満足しています。

1. 男の子が鯛を釣り上げた画像

2. 男の子が一礼している画像

3. 男の子が腕組みし頭の上に?マークが浮かんでいる画像

4. 男の子が釣り竿をかついで歩いている画像

5. 男の子が腕組みし、唸っている画像

6. 男の子がイカを釣り針につけている画像

7. 男の子が海に釣竿を投げた画像

8. あたりがきて、浮きが海の中に引っ張れる様子

9. 男の子が鯛の魚拓をとっている画像

10. 男の子が腕を組み、うなづき、共感している様子の画像

11. 男の子、イカ、鯛がうなづき、共感している様子の画像

12. 男の子、イカ、鯛が一礼している画像

感想

今回クラウドソーシングを初めて使い、画像作成していただきました。 振り返り失敗したこと・事前に確認しておくべきことなどを共有します。

仕事依頼を2件出してしまった

同じ仕事依頼を2件出してしまいました。 原因としては仕事の応募期限の設定を間違えてしまったためです。

契約金額の妥当性

クラウドソーシング・画像作成依頼も初めて、で契約金額設定に悩みました。

結果、個人的な価値観というか考えで3万円に設定しました。 画像12枚で3万円というと1画像あたり2500円ということになります。

このあたりの相場というか価格設定の妥当性がよくわからず仕事依頼しました。 価格の相場感を事前に理解しておくことは大事かなと思いました。

著作権について

ものづくり系のお仕事依頼では著作権が気になると思います。 お仕事依頼する前に理解しておくべきことだと思いますが、私は後から理解しました。

クラウドワークスの場合はつぎのとおりです。

【共通】成果物の著作権等の知的財産権について crowdworks.secure.force.com

【共通】コンペの採用作品の著作権等の知的財産権について crowdworks.secure.force.com

さいごに

【はじめてのクラウドソーシング体験記】は如何でしたでしょうか? 読んでくださった方の参考になれば嬉しいです。

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

CのあいまいなソースコードをRustで実行する

この記事はCの未定義動作など、あいまいなソースコードをRustでコンパイル・実行し

コンパイル・実行結果を比較してみよう、というものです。

Webブラウザのみで確認できるシミュレータを使うので、気になった方は後述のシミュレータで 動作確認してみてください。

背景

Rustの学習を始めて自社の勉強会でアウトプットすることにしました。

C/C++とRustのコードを比較し、Rustの安全さ・モダンさを知ってもらえれば・・・と思いました。

RustからC/C++の安全なソースコードの書き方も学べるかな、と思ったのも勉強会・記事を書いた理由です。

Rust初心者の方向けの内容と思います。

資料とソースコード

資料とソースコードは次の場所に置いています。適宜参照ください。

資料

Speaker Deck: 20210830_Rust入学式.pdf - Speaker Deck

または

SlideShare:20210830 rust入学式

※資料の28ページ以降にはCとRustの実行結果を記載しています。 こちらは後から確認することをお勧めします。

ソースコード

GitHub - grace2riku/c_cpp_vs_rust at master

未定義動作

RustとCのコードを比較するにあたりCの標準規格はC99にすることにしました。 理由は仕事で使っているコンパイラのバージョンと同じだからです。

C99の未定義動作の定義はこちらです。

未定義動作 - Wikipedia

コンパイラ

未定義の動作に対して,その状況を無視して予測不可能な結果を返してもよい。

だそうです。

未定義動作に該当するコードを書いてしまうと危険そうですね・・・。

確認環境

RustとC/C++の確認環境は次にしました。

C/C++

https://wandbox.org/

Cの設定はデフォルトから次の項目を変更します。

Rust

Rust Playground

デフォルトの設定のままにします。 動作確認したときの設定は次になっていました。

  • Stable version: 1.54
  • Edition 2018

確認テーマ(CとRustの比較)

次のテーマについてC、Rustでコンパイル・実行結果を比較します。

ファイル拡張子はCは.c, Rustは.rsです。

1. 整数型オーバーフロー: val_overflow.*

整数型の有効範囲を超えた値を代入し実行してみます。

2. 未初期化変数の参照: uninitialized_val.*

定義した変数を初期化することなく参照・使用します。

3. ゼロ割り: div_by_zero.*

0で割ります。

4. 配列要素外アクセス: array_index_err.*

定義した配列の要素数を超えた領域にアクセスします。

5. ビットシフトオーバーフロー: shift_overflow.*

変数型のビット長を超えてビットシフトさせてみます。

6. ビットシフト負の数: shift_negative.*

ビットシフトに負の数を指定します。

7. enum, switch: enum_switch.*

switchとmatch、enumについてCとRustで比較してみます。

  • Cはswitch、Rustはmatch文の条件をひとつ削除して実行してみてください。

  • print_shape(Circle);の引数Circleを1(または任意の整数値)に変更して実行してみてください。

確認テーマ(C++とRustの比較)

ファイル拡張子はC++.cpp, Rustは.rsです。

wandboxの【Languages】は【C++】に変更し実行してみてください。

1. 多態: polymorphism.*

多態の説明にありそうなサンプルコードを書きました。こちらのテーマはソースコードを比較してみてください。

次がサンプルコードのクラス図です。 f:id:gracehime:20210831124430p:plain

図形を抽象クラスとして、円・三角形・正方形の各クラスに実装を行います。

抽象クラスのメソッドは次の2つです。

  • 図形の種別を表示するprint_type

  • 図形の面積を計算するcalc_area

実装クラスに面積を計算するためのプロパティを追加しています。

私は多態をRustで実現したことがなかったので実装してみました。

コードの比較をするためにC++でも多態を書いてみました。 普段C++を使っていないこともあり仮想関数の実装について忘れていました。 Rustで多態をやってみた感想ですが、C++と変わらずむしろC++よりもシンプルに書けたような気がしました。

最後に

ここまで読んでいただきありがとうございました。

C・C++とRustの比較は如何でしたでしょうか?

実際にソースコードを実行することでRustのコンパイラの安全性が体感できたのではないでしょうか。

Rustの言語仕様からより安全なC、C++ソースコードを書く際のなにかヒントになれば嬉しいです。

AWS(EC2)でSTM32MP1 用の組込みLinux(OpenSTLinux)をコンパイルした件

この記事はSTマイクロエレクトロニクス社のプロセッサ・STM32MP1の組込みLinux(OpenSTLinux)を AWSのEC2でコンパイル環境構築した際の記録です。

AWSで組込みLinuxコンパイルしたときにどの程度費用がかかるかざっくり知りたい方は参考になるかもしれません。

背景

 従来からシングルコアマイコンを使っていましたが、今後は機能要求・通信データ量の増加もあり、 マルチコアプロセッサを検討することになりました。

シングルコアの従来システムは画像処理しながらリアルタイムな通信処理をおこなっています。

現状システムから処理負荷分散を考えると

  • それほど厳密なリアルタイム性が求められない画像処理を担当するコア

  • リアルタイム性が求められる通信処理を担当するコア

のようにしたいと考えました。

そこで前述の要求を満たすことが可能なプロセッサとしてSTマイクロエレクトロニクス社のSTM32MP1を見つけました。

STM32MP1のCortex-Aコアで画像処理、Cortex-Mコアでリアルタイム処理を担当させることができれば良さそうと思いました。

STM32MP1は組込みLinux(OpenSTLinux)のうえで動くということでした。 そこでSTM32MP1の評価基板(STM32MP157C-DK2)を購入し、色々試してみることにしました。

情報収集

 STM32MP1の情報収集していき、次のセミナーに参加しました。

www.stmcu.jp

セミナーの資料はこちらのリンクにあります。

www.stmcu.jp

OpenSTLinuxコンパイル環境にはいくつか選択肢がありますが今回はAWSコンパイルすることにしました。

とてもわかりやすい・丁寧な資料で文中で紹介されている動画通りの手順で環境構築することが可能です。

AWSを開発環境に決定した理由

 当初はWindows PCにVirtualBoxをインストールし、ゲストOSにUbuntuの構成でコンパイルを試しました(OpenSTLinuxはUbuntuコンパイルする必要があります)。

しかし、Windows PC 2台でOpenSTLinuxのコンパイルを試しましたが2台ともに失敗しました。

推測ですが、

  • 1台目はPCスペック不足に起因する原因

  • 2台目はネットワーク環境に起因する原因(あるパッケージだけがダウンロードできなかった)

でした。

 そこでセミナー資料で紹介されていたAWS EC2でコンパイル環境構築を試すことにしました。

  ※OpenSTLinuxのコンパイルPCのスペックはこちらに記載されています。

wiki.st.com

  • 2 Recommended PC configurations

 次がコンパイルPCのスペックの抜粋です。

  • クロック:i5-2540M @ 2.6 GHz

  • RAM:8 Gbytes

  • 320 Gbytes

私の技術バックボーン

 OpenSTLinuxをAWSコンパイルすることを決めましたが、本件を試す前の私の技術バックボーンを紹介しておきます。

Linuxに関して

 組込みLinuxの開発経験はありません。Linuxコンパイルした経験もありません。Linuxのコマンドはなんとなく理解しているレベルです。

AWSに関して

 これまでAWSで開発環境を構築した経験はありません。

2019年11月にとあるセミナーでAWSアカウントを作成する必要がありAWSアカウントはつくっていました。 2021年6月に色々試したのですが、無料利用枠期間(1年間)も既に終了していました。

このような背景のため、本件の記事は最適な運用ができていない(無駄にお金を使っている)と思います。

後述する費用はあくまで参考、ということにご注意ください。

AWSを使うことの懸念

 「OpenSTLinuxをコンパイルするとどれくらいの費用がかかるのか」がわからないことでした。

調査・学習してからAWSで開発環境構築すれば良いかも思いましたが、知識・経験がほとんどない状態でとりあえず試してみることにしました。

結果

AWS請求費用

 合計で32.60ドルの費用がかかりました。

次の資料が費用の内訳です。 drive.google.com

費用概要

 EC2でUbuntu 18.04のサーバを構築したので、費用内訳の資料を見るとElastic Compute Cloudの部分に費用が集中しています。

OpenSTLinux環境構築

 結果としてOpenSTLinuxがコンパイル環境ができました。

OpenSTLinuxの起動イメージをコンパイルし、STM32MP1の評価基板(STM32MP157C-DK2)でOpenSTLinuxがブートできました。

OpenSTLinuxの作業内容

 OpenSTLinuxの環境構築は具体的に次の作業を行いました。

OpenSTLinuxのコンパイルに必要なツールをインストールします。   wiki.st.com

3.2 Installing extra packagesを実行します。

 OpenSTLinuxをコンパイルします。

wiki.st.com

5 Installing the OpenSTLinux distributionからの手順、

5.1 Initializing the OpenEmbedded build environment、

6 Building the OpenSTLinux distributionを実行します。

コンパイルですが6/11 23:20頃に開始し、6/12 9:49頃に確認したら正常終了していました。

コンパイル開始後10時間くらいには終了していました。

 SDKコンパイルは次の手順を実行しました。

wiki.st.com    SDKコンパイルは4時間ほどかかりました。

  • SDカード書き込みイメージの作成

 OpenSTLinuxのSDカード書き込みイメージを作成します。次の手順を実行しました。

How to populate the SD card with dd command - stm32mpu

感想

  • AWS費用の管理がザルでした。

  EC2インスタンスを使わないときも実行してしまっていました。

 EC2を一切使わないのにインスタンス実行中のまま2日間くらい放置してしまいました。

 EC2を使わないときはインスタンスを停止することで費用を抑えることができると思います。

 その辺のコストの感覚というか費用をおさえるために何をしなくてはいけないのかがわかっていませんでした。

 EC2でOpenSTLinux起動イメージができましたがそれをSDカードに書き込むのに少し面倒でした。

SDカードへの書き込みは次の手順で実施しました。

 ①EC2上にあるOpenSTLinux起動イメージをscpコマンドでローカルPCにダウンロード   ↓

 ②ローカルPCのOpenSTLinux起動イメージをSDカードに書き込み

ローカルPCにVirtualBox+Ubuntuで環境構築できていれば①の手順は必要ありません。

SDカードなどの物理的なストレージにOS起動イメージを書き込む際はひと手間必要なことがAWSを使ううえで少し面倒と感じました。

上記の点を差し引いてもAWSを使うメリットがあると思いますが知識がないためその辺が理解できていません。

最後に

 Linuxコンパイルもはじめて、AWSでサーバを立てるのもはじめてで、できるかどうか不安でしたがなんとかできました。

 これから組込み開発環境をAWSで構築しようと考えていた方のなにか参考になると嬉しいです。 

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

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

最後に

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

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

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