編集履歴一覧に戻る
verylowfreqのアイコン画像

verylowfreq が 2023年06月25日19時49分43秒 に編集

初版

タイトルの変更

+

50円のRISC-VをArduinoで使う 【WCH CH32V003F4P6】

タグの変更

+

Arduino

+

RISC-V

記事種類の変更

+

セットアップや使用方法

Lチカの変更

Lチカが設定されました

本文の変更

+

たった50円で買えるRISC-Vマイコン CH32V003F4P6 を、Arduino IDE環境でコードを書いて、Lチカしてみます。 この記事は、以下の動画の補足記事です。VTuberとしても活動してますので、ぜひ動画も見てください!!!! @[youtube](https://youtu.be/T3QOtFcP7Tc) ## マイコン / Microcontroller CH32V003F4P6 - RISC-V RV32ECコア - Flash 16KB - RAM 2KB - GPIO x18 - ADC x8, SPI, I2C, USART ## 必要なもの ブレッドボード上で試作する場合です。 - マイコン CH32V003F4P6 - [https://akizukidenshi.com/catalog/g/gI-18061/](https://akizukidenshi.com/catalog/g/gI-18061/) - デバッグケーブル WCH-LinkE - [https://akizukidenshi.com/catalog/g/gM-18065/](https://akizukidenshi.com/catalog/g/gM-18065/) - ブレッドボード - TSSOP20変換基板 - LED x8 - タクトスイッチ(リセットボタン用) - 配線材 ## 回路 8つのLEDを点滅させる回路です。 リセットは、内部でプルアップされているので、とりあえずスイッチ経由でGNDへ落とせば動きます。 PD1(SWIO)を、WCH-LinkEのSWDIOと接続します。 チップ自体の電源は 3.3Vでも5Vでも動きますが、今回は3.3Vで動かします。WCH-LinkEの電源出力が利用できます。 内蔵クロックで動作するので、外付けクリスタルなどは不要です。 TSSOP20パッケージは 0.65mm ピッチですが、これは手ハンダでいけます。位置合わせて、ハンダを盛って、吸い取れば、オッケーです。 ![回路図 (クリックで全体表示)](https://camo.elchika.com/e67dd57f54d67a0154aeb912450e9ac330cf140e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32376633303665652d656131352d343334662d626333342d6162343139336638333839392f62343438323561382d353066302d343963642d396562362d666634623534623133313035/) ## 準備 WCH-LinkUtilityをダウンロードし、1回だけ起動します。 [https://www.wch.cn/downloads/WCH-LinkUtility_ZIP.html](https://www.wch.cn/downloads/WCH-LinkUtility_ZIP.html) 起動時に勝手にドライバをインストールしようとするので、許可してあげます。 購入直後はARMチップ向けのモードになっているので、RISC-Vモードへ変更します。 (動画を参照) Arduinoのボードライブラリは Arduino core support for CH32 EVT Boards を利用しました。 [https://github.com/openwch/arduino_core_ch32](https://github.com/openwch/arduino_core_ch32) ## Arduinoコード Arduinoのコードなので、まぁ普通の感じです。 ``` const uint8_t PIN_LED_ARRAY[] = { PC1, PC2, PC3, PC4, PC5, PC6, PC7, PD2 }; const size_t PIN_LED_ARRAY_COUNT = (sizeof(PIN_LED_ARRAY) / sizeof(PIN_LED_ARRAY[0])); void setup() { // put your setup code here, to run once: for (size_t i = 0; i < PIN_LED_ARRAY_COUNT; i++) { pinMode(PIN_LED_ARRAY[i], OUTPUT); digitalWrite(PIN_LED_ARRAY[i], LOW); } } void loop() { // put your main code here, to run repeatedly: static int cnt = 0; for (size_t i = 0; i < PIN_LED_ARRAY_COUNT; i++) { if (i == cnt) { digitalWrite(PIN_LED_ARRAY[i], HIGH); } else { digitalWrite(PIN_LED_ARRAY[i], LOW); } } cnt = (cnt + 1) % PIN_LED_ARRAY_COUNT; delay(50); } ``` ## その他 - 動画で触れるのを忘れたんですけど、内蔵クロックで動くので、配線がすごく少なくて済みます。 - まだ実用ソフトは書いてないので詳細不明ですが、ファームウェアのサイズはちょっと心配。