はじめてのクラウドソーシング体験記
この記事は何???
先日はじめてクラウドソーシングでプレゼン資料に使う画像をつくってもらいました。 そのときの体験記です。
背景
昨年2021年11月に会社のプレゼン資料の画像作成をクラウドワークスで募集しました。 そのときの経験談を共有すれば誰かの役に立つかもしれない・・・と思ったのでブログに書くことにしました。
どんな画像作成だったのか?
次のコンセプトで画像作成依頼しました。
概要
プレゼン資料に作成画像を貼りつけ、パラパラ漫画風にプレゼンしていくことを想定した。
デザインイメージ
プレゼンのストーリーが【少ない工数で大きな成果を出したこと】をテーマにしている。 少ない工数で大きな成果をだしたこと == 【イカで鯛を釣る】のストーリーをパラパラ漫画風にしたいと考えている。
※本来は【エビで鯛を釣る】だがプレゼンがイカにちなんだ名称のため【イカで鯛を釣る】にした。
デザイン登場人物
- 男の子
- イカ
- 鯛
- 釣り竿
- 浮き
- 魚拓の紙
作成イメージ種類
- 男の子が鯛を釣り上げた画像 ※イカは描かなくて良いです。躍動感があると嬉しいです。
- 男の子が一礼している画像
- 男の子が腕組みし頭の上に?マークが浮かんでいる画像
- 男の子が釣り竿をかついで歩いている画像
- 男の子が腕組みし、唸っている画像
- 男の子がイカを釣り針につけている画像
- 男の子が海に釣竿を投げた画像
- あたりがきて、浮きが海の中に引っ張れる様子 ※男の子も書いてほしいです。
- 男の子が鯛の魚拓をとっている画像
- 男の子が腕を組み、うなづき、共感している様子の画像
- 男の子、イカ、鯛がうなづき、共感している様子の画像 ※男の子は10の画像の流用でお願いします。
- 男の子、イカ、鯛が一礼している画像 ※男の子は2の画像の流用でお願いします。
お仕事依頼の文面は次のリンクのようにしました。 crowdworks.jp
どんな画像が出来たのか?
多くの方に画像を提案いただきましたが(予想以上に応募いただいて驚いた)、 まるこめっとさん(@marukomet_blog)の画像を採用させていただきました。
作成イメージと画像を掲載します。
※まるこめっとさんからブログ掲載許可はいただいています。
どれも可愛いらしい、素敵な画像でひと目見て気にいりました。
また依頼するときに要件を少し細かく指定させていただいたこともあってかストーリー性があり、 今回のプレゼン以外でも使えそうな汎用的な画像が出来て非常に満足しています。
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
または
※資料の28ページ以降にはCとRustの実行結果を記載しています。 こちらは後から確認することをお勧めします。
ソースコード
GitHub - grace2riku/c_cpp_vs_rust at master
未定義動作
RustとCのコードを比較するにあたりCの標準規格はC99にすることにしました。 理由は仕事で使っているコンパイラのバージョンと同じだからです。
C99の未定義動作の定義はこちらです。
未定義の動作に対して,その状況を無視して予測不可能な結果を返してもよい。
だそうです。
未定義動作に該当するコードを書いてしまうと危険そうですね・・・。
確認環境
RustとC/C++の確認環境は次にしました。
C/C++
Cの設定はデフォルトから次の項目を変更します。
Rust
デフォルトの設定のままにします。 動作確認したときの設定は次になっていました。
- 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.*
多態の説明にありそうなサンプルコードを書きました。こちらのテーマはソースコードを比較してみてください。
次がサンプルコードのクラス図です。
図形を抽象クラスとして、円・三角形・正方形の各クラスに実装を行います。
抽象クラスのメソッドは次の2つです。
図形の種別を表示するprint_type
図形の面積を計算するcalc_area
実装クラスに面積を計算するためのプロパティを追加しています。
私は多態をRustで実現したことがなかったので実装してみました。
コードの比較をするためにC++でも多態を書いてみました。 普段C++を使っていないこともあり仮想関数の実装について忘れていました。 Rustで多態をやってみた感想ですが、C++と変わらずむしろC++よりもシンプルに書けたような気がしました。
最後に
ここまで読んでいただきありがとうございました。
C・C++とRustの比較は如何でしたでしょうか?
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の情報収集していき、次のセミナーに参加しました。
セミナーの資料はこちらのリンクにあります。
OpenSTLinuxコンパイル環境にはいくつか選択肢がありますが今回はAWSでコンパイルすることにしました。
とてもわかりやすい・丁寧な資料で文中で紹介されている動画通りの手順で環境構築することが可能です。
AWSを開発環境に決定した理由
当初はWindows PCにVirtualBoxをインストールし、ゲストOSにUbuntuの構成でコンパイルを試しました(OpenSTLinuxはUbuntuでコンパイルする必要があります)。
しかし、Windows PC 2台でOpenSTLinuxのコンパイルを試しましたが2台ともに失敗しました。
推測ですが、
1台目はPCスペック不足に起因する原因
2台目はネットワーク環境に起因する原因(あるパッケージだけがダウンロードできなかった)
でした。
そこでセミナー資料で紹介されていたAWS EC2でコンパイル環境構築を試すことにしました。
※OpenSTLinuxのコンパイルPCのスペックはこちらに記載されています。
- 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のコンパイルに必要なツールの準備
OpenSTLinuxのコンパイルに必要なツールをインストールします。 wiki.st.com
3.2 Installing extra packagesを実行します。
- OpenSTLinuxのコンパイル
OpenSTLinuxをコンパイルします。
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時間くらいには終了していました。
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ファイルが出力されます。
出力されたファイルを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
起動時のシリアルメッセージ、!から~までの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
小型の可愛らしい基板(リーフと呼ばれる)をスタックしていくことで機能を自由に組み合わせ可能なデバイスです。 これです。
Basic Kitはケース付きです。何気に嬉しい・痒いところに手が届く・重宝します!!!
IoTのエッジが簡単に出来ると謳われています。 制御マイコンはArduino Unoと同じATmega328PまたはESP32です。 この記事はATmega328PでRustを動かしました。
なぜターゲットをLeafonyにしたのか?
1年前にelchikaさんのキャンペーンでLeafonyのキットが当選し手元にあったこと、最近ArduinoでRustを学び始めていたからです。
LeafonyのBasic Kitでは次の基板から構成されており色々試行錯誤できるかも・・・と思ったことも理由です。 docs.leafony.com
Bluetooth、温度・湿度・照度・加速度センサなどのリーフで構成されています。
Basic Kitのサンプルプログラムはこちらでも紹介されています。 docs.leafony.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つのソースコードです。
boards/arduino-uno/examples/Battery_Voltage.rs 次のLeafonyのバッテリ電圧読み取りサンプルプログラム相当をRustで書いてみました。 docs.leafony.com I2Cでバッテリ電圧読み取り、バッテリ電圧をシリアル通信で送信、1秒間隔でLED点滅しています。
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ケーブルで接続します。
Teratermなどのシリアルターミナルを起動し、通信条件を下図に設定します。
そうするとシリアルターミナルにバッテリ電圧が表示されます。 電源リーフのスイッチをONにするとバッテリ電圧が読み取りできます。
非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
- 2020/12/05
- 2020/08/21
- 2020/08/21
- 2020/08/03
- 2020/04/06
- 2020/03/23
connpass
- 2020/11/30
- 2020/11/25
- 2020/11/17
- 2020/10/27
- 2020/10/23
- 2020/10/20
- 2020/10/15
- 2020/10/14
- 2020/10/10
- 2020/09/22
- 2020/08/05
- 2020/07/30
技術書典10で「GCC開発環境構築入門(EVカート編)」を頒布します
最近は12/26から開催される技術書典10向けに技術書を書いていました。 techbookfest.org
昨日(12/24)、ついに本が完成しました。 techbookfest.org
本のタイトル:GCC開発環境構築入門(EVカート編)
サークル名:k-abe
今回はこの技術書について紹介したいと思います。
なんの本か?
本のタイトル通りですが、GCC開発環境を構築した話です。 対象ハードウェアはCQ出版社より販売されているEVカートです。
組込みソフトウェアで、プログラミング言語はC言語です。 GCC開発環境構築後、既存ソースコードをGCC開発環境向けに変更した内容も書きました。
書いた理由は?
EVカートの既存ソフトウェアはルネサスエレクトロニクス社の統合開発環境+ソースコード自動生成ツールで開発していました。 私の学習目的でGCCへの開発環境移行にチャレンジしてみたかったのでしてみました。 開発環境構築する際の手順、はまったことなどを共有すれば誰かの役にたつかも・・・と思ったことが理由です。
本の紹介
本のページを少し紹介していきます。
表紙
表紙です。
本のタイトル、サークル名は次のとおりです。是非、お忘れなきように・・・。
本のタイトル:GCC開発環境構築入門(EVカート編)
サークル名:k-abe
前回の技術書同様(https://k-abe.hatenablog.com/entry/techbookfest-9/evkartmbd)、味気ない表紙です。今回もこんな感じでいきます。 いつか格好いい表紙をつくる!!!
前書き
前書きです。
ここに「この本を書いた自分の正直な思い」を書きました。
「開発環境構築に何度も失敗し虚無感を感じた」の前後です。
ここに共感いただけるエンジニアの方もいるのでは???、と個人的に思っています。
目次
目次です。
前半は次の内容を書いています。
後半はGCC開発環境構築した後の話です。GCCで開発するために必要になった変更点を書いています。 統合開発環境とGCCでは一体何が違うのか?、気になった方は是非、見てください。
はじめに
開発対象のEVカートについて簡単に説明しています。
最後に
紹介は以上になります。 如何でしたでしょうか?少し興味が湧いたでしょうか? 気になった方は(そうでない方も)是非、試しに読んでみてください。
ソフトウェア開発の最初の壁とも言える開発環境構築に自分なりに迫って書きました。 本書が興味を持って読んでくださった方になにか役立てば嬉しいです。
以上になります。最後まで読んでいただきありがとうございました。