Open Source Hardware、Arduino 與 Platformio之碎碎念

2021-02-19 全棧歲月
1.Open Source Hardware
6,7年前就感覺到嵌入式系統開發陷入了困境,為了擺脫困境就開始網際網路的開發,並從中悟出OSH(open source hardware)是擺脫困境的唯一出路。於是開始測評各種OSH平臺,發現OSH在遭遇了傳統嵌入式應用領域的頑強抵抗後轉戰教育與創客領域,首先是Raspberry Pi讓網際網路控制個燈這樣的物理對象變得非常容量,接著Raspberry Pi搭上了AI的快車;同時以MCU為基礎的的Arduino也在創客中快速發展,當然還有ARM的mbed。然而我認為真正讓OSH騰飛的是將arduino移植到ESP8266的Luca Passarella。我認為Luca Passarella的最大貢獻就是強調軟體框架,讓OHS中的H隱藏起來,這和網際網路的跨平似乎是一致的。
Arduino for esp8266伴隨著esp8266的發展逐漸進入傳統嵌入式開發應用領域,arduino for esp32在樂鑫的支持下迅速推出了穩定版,使嵌入式開發的先行者擺脫了傳統嵌入式開發的種種約束,mbed,ST等CPU廠家的融入又推動了Arduino的發展,同時各種外設廠家不斷拓展了arduino的生態,arduino已成為OSH的主流平臺。
在測評中享受了OSH的便捷,但失落感也非常強,幾十年的功底拉回到與中學生在同一起點,無意識的找茬一個接一個從腦袋中冒出,讓我感覺到了什麼是不忘初心的重要性,能讓我堅持下來的也正是初心,我的初心就是要擺脫嵌入式開發面臨的困境。2.Arduino Lib在用C語言開發嵌入式系統之初,庫的作用更多局限在開發者本人,或者一個小團體內部,當時還沒有生態的概念;後來儘管嵌入式開發工具也支持C++了,但嵌入式系統自身的開發模式決定了用C++是多此一舉,就連激進的我也是為了應用而應用C++,但隨著熱情的漸退,儘管文件後綴是CPP,但內容還是C,掛的是CPP,賣的還是C。
arduino是在C++成熟後才發展起來的,它不需要考慮Linux那樣的歷史原因,沒有考慮兼容C,所以生態的支撐平臺十分簡潔。庫是生態的實例化,arduino庫是標準的C++庫,它不支持C,最基本的庫是一個H文件

#ifndef __LED_H_
#define __LED_H_
#include <Arduino.h>
class LED {
 public:
  void begin(uint8_t ledName);
  void flashLED(uint8_t ledNum);
};
#endif

#include "led.h"
void LED::begin(uint8_t ledNum) {
  pinMode(ledNum, OUTPUT);
}
void LED::flashLED(uint8_t ledNum) {
  static uint8_t ledState;
  if (ledState == 0) {
    digitalWrite(ledNum, HIGH);
    ledState = 1;
  } else {
    digitalWrite(ledNum, LOW);
    ledState = 0;
  }
}

其中begin是必須的,是對這個對象進行初始化,它是放在main.cpp的setup()中,下面是應用實例:

#include <Arduino.h>
#include <Wire.h>
#include "Adafruit_BME280.h"
#include "Adafruit_Sensor.h"
#include "led.h"
#define ledNum 2
LED led;
Adafruit_BME280 bme;  // use I2C interface
Adafruit_Sensor* bme_temp = bme.getTemperatureSensor();
Adafruit_Sensor* bme_pressure = bme.getPressureSensor();
Adafruit_Sensor* bme_humidity = bme.getHumiditySensor();

void setup() {
  // put your setup code here, to run once:
  led.begin(ledNum);
  Serial.begin(115200);
  Wire.begin(4, 5);
  Serial.println(F("BME280 Sensor event test"));
  if (!bme.begin(0x76, &Wire)) {
    Serial.println(F("Could not find a valid BME280 sensor, check wiring!"));
    while (1)
      delay(10);
  }

  bme_temp->printSensorDetails();
  bme_pressure->printSensorDetails();
  bme_humidity->printSensorDetails();
}

void loop() {
  // put your main code here, to run repeatedly:
  sensors_event_t temp_event, pressure_event, humidity_event;
  bme_temp->getEvent(&temp_event);
  bme_pressure->getEvent(&pressure_event);
  bme_humidity->getEvent(&humidity_event);

  Serial.print(F("Temperature = "));
  Serial.print(temp_event.temperature);
  Serial.println(" *C");

  Serial.print(F("Humidity = "));
  Serial.print(humidity_event.relative_humidity);
  Serial.println(" %");

  Serial.print(F("Pressure = "));
  Serial.print(pressure_event.pressure);
  Serial.println(" hPa");

  Serial.println();
  led.flashLED(ledNum);
  delay(1000);
}

3.Platformio FolderVscode是目前網際網路開發中應用最廣泛的IDE,vscode+platformio將網際網路的拓展到了嵌入式系統,是全棧開發人員的利器。platformio的框架目錄結構是框架的實例化。框架目錄結構的詳細內容參考https://docs.platformio.org/en/latest/projectconf/section_platformio.html#directory-options

下面是一個platformio工程目錄實例:

├─.pio
│  ├─build
│  │  └─nodemcuv2
│  └─libdeps
│      └─nodemcuv2
│          ├─Adafruit BusIO
│          │  ├─.github
│          │  │  └─workflows
│          │  └─examples
│          │      ├─i2corspi_register
│          │      ├─i2c_address_detect
│          │      ├─i2c_readwrite
│          │      ├─i2c_registers
│          │      ├─spi_modetest
│          │      ├─spi_readwrite
│          │      ├─spi_registers
│          │      └─spi_register_bits
│          └─Adafruit SHT31 Library
│              ├─.github
│              │  └─workflows
│              └─examples
│                  └─SHT31test
├─.vscode
├─include
├─lib
│  ├─BMP280
│  │  └─examples
│  │      ├─advancedsettings
│  │      ├─bme280test
│  │      └─bme280_unified
│  ├─LED
│  └─sensor
│      └─examples
│          └─sensortest
├─src
└─test

platformio有4種方式來放置庫,它們是:
3.1 與arduino core直接相關的庫。這類庫隱藏很深,找起來很費力,乾脆就不找了,反正與您關係不大。
3.2 與arduino core無關,但註冊了的第三方庫,可以在platformio主頁中的庫裡面搜索,安裝後它存放在.pIO子目錄的libdeps中
3.3 自建的庫放在lib子目錄中
3.4放在其它地方的庫,需要在platformio.ini中用

4.platformio.ini每個項目的根目錄下都有一個項目配置文件platform.ini,(https://docs.platformio.org/en/latest/projectconf/index.html)。它涉及到的東西太多,要一下子就能靈活應用還是有一定的難度,在用中學是一個很好的打法,要快速用起來我感覺還是要掌握下面一些內容:
4.1 uploading
Uploading是第一步,它包括:
(1)upload_protocol的內容在https://docs.platformio.org/en/latest/boards/index.html中。upload_protocol很重要,如果沒有它程序upload下去,燈都無法點,所以軟硬體開發都要掌握。
(2)upload_port涉及內容具體,如果在platformio.ini中沒有upload_port則ploatformio就自己找,如果找不到就需要配置,例如:

/dev/ttyUSB0 - Serial port (Unix-based OS)
COM3 - Serial port (Windows OS)
192.168.0.13 - IP address when using OTA
/media/disk - physical path to media disk/flash drive (Mbed enabled boards)
D: - physical path to media disk/flash drive (Windows OS).

4.2 monitor
Arduino開發更象電腦程式開發,經常要用print及其println觀察一些變量。print及println的默認就是串口
monitor_port和upload一樣
monitor_speed,串口波特率
4.3 build_flags
build_flages通常可以不設置,但有USB接口的,還是要考慮。因為除了用USB upload程序外,使用USB的CDC monitor非常方便。build_flages的內容在https://docs.platformio.org/en/latest/boards/index.html。下面是st32f411的platformio.ini

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:genericSTM32F411RE]
platform = ststm32
board = genericSTM32F411RE
framework = arduino
build_flags =
   -D PIO_FRAMEWORK_ARDUINO_ENABLE_CDC
   -D USBCON
   ;-D USBD_VID=0x0483
   ;-D USBD_PID=0x5740
   ;-D USB_MANUFACTURER="GOSIP"
   ;-D USB_PRODUCT="\"PyDuino 411RE\""
   ;-D HAL_PCD_MODULE_ENABLED
;lib_deps = LEDLIB
monitor_port = /dev/tty.wchusbserial1420
monitor_speed = 115200
upload_protocol = stlink
;upload_protocol=serial
;upload_port=/dev/tty.wchusbserial1420
;upload_protocol = dfu
;upload_port = anything

5.Platformio Command儘管platformio提供了一些圖標,但這些圖標並不完全,在Terminal中用命令更方便快捷,常用的命令有:
Plaformio run編譯
pio -t upload下載程序
pio -t uploadfs 下載文件系統
pio upgrade --dev更新platformio系統
其它命令在https://docs.platformio.org/en/latest/core/index.html中6.OS優先用Linux和Mac Os吧,原因就不展開了。

相關焦點

  • Arduino為什麼這麼火
    正文:這一兩年間,arduino作為一個能夠快速表現設計想法的工具,日漸火了起來,愛好者們自發性、非官方組織起來的論壇社區日漸豐富和活躍,近一兩年小夥伴們的作品集中也越來越多地涉及arduino相關的項目案例,那麼我們就簡單地來看一下
  • SAST Weekly | vscode 插件PlatformIO簡介
    在vscode擴展頁面下搜索platformio即可找到,選擇第一個Platformio IDE(一個橙色的外星人圖標),安裝即可    需要注意的是,PlatformIO支持的python版本是python2.7,所以在安裝之前要先確定自己安裝了python2.7。
  • 記帳 App 都會碎碎念,我的「理財夢」是不是終能實現?
    「碎碎念記帳」是一款獨立團隊開發的小應用,用對話的形式來記帳是最大的特點。每一筆花銷都是用聊天的方式生成記錄,並且還有喜歡碎碎念的「爸媽」吐槽你的花錢如流水。但它還是有幾個致命弱點:UI 風格太陳舊(醜得有些過分了),且繁體字的設定會讓人有些不適,不過它還是贏在了創意上。
  • 小王碎碎念 | WWDC 2021
    小王碎碎念將不定期更新一些小王自己的想法,也正如這個標題一般!請持續關注管老辦!小王會持續為你們帶來更加精彩好看的內容!管會辦公室是我們永遠的家!這裡會有你意想不到的精彩!
  • 【Video】4 expats initiate open source platform 四個歪果仁齊聚華強北 玩轉硬體加速器
    > (Courtesy of Tan Yifan)An opening ceremony for Troublemaker, an open
  • 這個 App 用碎碎念做到了… AppWall 精選 #026
    本期主打介紹的是 碎碎念記帳,一款能夠用對話方式生成記帳記錄的應用 。當你在裡面記下每一筆開銷,都會獲得類似爸媽碎碎念的自動回復,讓記帳這件事變得簡單有趣。此外,還有 9 個優質的 app/遊戲推薦分享給大家,在此特別感謝這些應用達人的安利。下面如果有合你心意的,長按識別二維碼或者複製連結到瀏覽器打開就可以下載啦。
  • 脫離Arduino IDE的外部編譯及上傳模式
    = %1set arduino_lib_path= %2%1\arduino-builder.exe -fqbn espressif:esp32:esp32 -build-path build -build-cache core_cache -hardware %arduino_lib_path%\hardware -libraries %arduino_lib_path%\libraries
  • 陳蛋蛋碎碎念—突破百度雲限速方法匯總更新二
    陳蛋蛋碎碎念—突破百度雲限速方法匯總更新一陳蛋蛋碎碎念—突破百度網盤限速,親測10M/S不寫了,不寫了,求點讚,求在看。
  • 來自一個裸辭轉行月薪8K+的新媒體運營兒的碎碎念
    因為沒有什麼雞血,也沒有什麼乾貨,有的只是我真誠的碎碎念。一個從雞血滿滿到焦慮崩潰到再坦然面對,結果還算尚可的經歷分享,我想要記錄在暖石的這段別樣的經歷。如果你想聽,那就繼續往下翻,希望可以帶給你一點幫助。關於前面為什麼裸辭、選擇轉行就不贅述了,我的碎碎念就從我遇到暖石來說~一開始加入暖石,我真的感覺雞血滿滿,刷課速度飛快,打卡率也都不低。一個月左右的時間,就刷完了所有課程。
  • 玩轉浪漫之Arduino花式點燈
    只要稍微有一點c語言基礎和初高中物理知識,就能利用arduino創造出許多好玩的智能小物件。本篇博文將簡單介紹如何使用arduino逐步實現簡單的物聯網控制:點燈,串口點燈,利用開發板點燈。一、準備首先我們需要下載arduino的開發環境去www.arduino.cc 下載 Arduino IDE軟體。一路下一步安裝打開開發環境。代碼區域主要分為setup和loop函數:setup函數部分是指開始程序前對一些環境的測試,而loop代碼段則是執行後arduino執行的部分。
  • Arduino基礎入門篇01
    可登陸Arduino官網(https://www.arduino.cc),學習了解更多Arduino信息。Arduino 是一款便捷靈活、方便上手的開源電子原型平臺,包含硬體(各種型號的arduino板)和軟體(arduino IDE),她適用於藝術家、設計師、愛好者和對於「互動」有興趣的朋友們。
  • 碎碎念存檔
    本月我寫過好幾篇碎碎念,但是還沒有想清楚應該如何成文。現在是7月31日,面臨馬上要再次清空內容,所以現在用公眾號記載一下這些碎碎念:背景:西祠胡同的響馬在中國網際網路早期就很活躍,最近他對搜尋引擎提出了一個自己的看法。順著他的看法,我有一些自己的思考。而且,這些思考和我早年間對網際網路的看法可能截然相反。
  • 125 open source Big Data architecture papers
    Big Data technology has been extremely disruptive with open source playing a dominant role in shaping its evolution.
  • Use Open Source to Hone Your Programming Skills
    Open Source is EverywhereAs the open source movement grew, so did the amount of code available to read and learn from.
  • 為TT擴展件打造一個「乾淨的」Arduino開發環境
    C:\Users\yunswj\Documents\Arduino\libraries複製到這裡把下載裡面的hardware文件夾裡面的ESP32文件夾:C:\Program Files (x86)\Arduino\hardware
  • Arduino新手工作坊之自製計步器|Arduino Beginners Workshop - DIY Pedometer
    將學習過的一些元件組合在一起做一個自製的計步器報名費用:會員價:RMB 150/人, 非會員價:RMB 200/人,Arduino工具包:RMB 210 (原價300) ; 購買優惠價:RMB 460 (包含:工作坊+工具包+新車間1個月會員費); 事先準備工作: - 筆記本電腦,並事先安裝好
  • 我與我一年份的碎碎念
    本文為個人碎碎念內含多圖,觀看前記得連接WiFi2017年2月 九華山↓去年過年去九華山拍的一個小視頻。在寫公眾號的時候,原本計劃收集下去年的一些小視頻集合一下來發,可惜編輯的時候才發現公眾號最多只能發三個視頻,只好作罷 。新的一年,或許可以嘗試一下新的記錄方式,多拍拍視頻之類的。
  • 陳蛋蛋碎碎念—免費下載文檔之百度文庫(上)
    陳蛋蛋碎碎念—一篇文章幫你搞定PDF編輯和轉換這是從吾愛論壇裡看到的,原來失效過一次,最近作者更新了,所以我也來介紹一下。相比較於冰點下載器,它還可以下載道客巴巴文檔,當然道客巴巴篇我們下次再介紹了。
  • 笨蓋的碎碎念
    但是我不像邁克那麼條理清晰,大概也就是想到哪兒寫到哪兒,碎碎念,大家不要介意。一切的開始差不多兩年前的這個時候,冬日裡還有陽光,邁克和我在閒聊時說,現在同志們都在其他遊戲裡找喜歡的角色,為什麼沒有專供同志娛樂的遊戲呢?於是我們調研了下。最多分享的是黑猴子系列,可以作為一時的「施法材料」,並不算是大型遊戲。
  • ESP8266 Arduino IDE 開發環境搭建
    下載並安裝1) Arduino IDE https://www.arduino.cc/en/software