2026年8月17日月曜日

FreeRTOS on Raspberry Pi Pico (ツールのOperating SystemでMPを選択)

書き込む際には、予めBOOTbuttonをつかってuf2が書き込めるようにしておく

書き込んだらIDEを閉じて再度開いてシリアルモニタする

 /******************************************************

 * FreeRTOS Mutex例題

 * - タスク2つ

 * 共有データの競合回避

 ******************************************************/

SemaphoreHandle_t xMutex;     

// Mutex変数定義 freertosではSemaphoreをMutexにも使う

volatile int sharedCounter = 0;   // 共有リソース、

// volatile をつけると、「この変数は外部から書き換わるかもしれないので、毎回メモリからちゃんと読み込んで」と指示できます

//==== タスク1 カウント値Serial送信 ====

void Task1(void *pvParameters) {

  while(1){

    if(xSemaphoreTake(xMutex, portMAX_DELAY)== pdTRUE){

// // 例:100ミリ秒だけ待つ設定(pdMS_TO_TICKSでミリ秒をシステム時間に変換) if (xSemaphoreTake(xMutex, pdMS_TO_TICKS(100)) == pdTRUE) { // 100ms以内にMutexを取れた場合の処理 xSemaphoreGive(xMutex); } else { // 100ms待っても取れなかった場合のタイムアウト処理 }

      int temp = sharedCounter;       // 共有データ取得

      temp++;

      vTaskDelay(pdMS_TO_TICKS(10));  // あえて遅延を入れて競合を誘発

      sharedCounter = temp;           // 共有データ更新

      Serial.printf("Task1: counter=%d\n", sharedCounter);

      xSemaphoreGive(xMutex); // MUTEX解放

    }

  }

}

//==== タスク2 カウント値Serial送信 ====

void Task2(void *pvParameters) {

  while(1){

    if(xSemaphoreTake(xMutex, portMAX_DELAY)== pdTRUE){

      int temp = sharedCounter;       // 共有データ取得

      temp++;

      vTaskDelay(pdMS_TO_TICKS(10));  // あえて遅延を入れて競合を誘発

      sharedCounter = temp;           // 共有データ更新

      Serial.printf("Task2: counter=%d\n", sharedCounter);

      xSemaphoreGive(xMutex);  

    }    

  }

}

//==== 初期設定 ====

void setup() {

  Serial.begin(115200);

  delay(1000);

  // 開始メッセージ

  Serial.println("\r\n=== Mutex counter demo ===");

  // Mutex生成

  xMutex = xSemaphoreCreateMutex(); //xTaskCreateで自動的に組み込まれる?

  // タスクの生成

  xTaskCreate(Task1, "task1", 2048, NULL, 1, NULL);

// xTaskCreate(Task1, "task1", 2048, NULL, 1, NULL);

                     ②       ③     ④   ⑤   ⑥
コードは注意してご使用ください。
番号引数意味詳しい説明
Task1実行する関数名タスクとして動かしたいC言語の関数を指定します。
"task1"タスクの作業名人間が見て分かりやすくするための名前です(デバッグ用)。
2048スタックサイズこのタスクがメモリ(スタック)を何バイト使うか(※)の指定です。
NULL関数への引数タスク関数にデータを渡さない場合は NULL にします。
1タスクの優先度数字が大きいほど優先されます。標準的な低い優先度です。
NULLタスクハンドル作成したタスクを後から削除・操作しない場合は NULL にします。
※注意(スタックサイズの単位について)
ESP32(Arduino等)では「バイト数(2048バイト)」ですが、一般的なFreeRTOS(マイコンによる)では「ワード数(4バイト単位なら2048×4=8192バイト)」を意味します。ESP32環境であれば2KBのメモリ確保という意味になります。

  xTaskCreate(Task2, "task2", 2048, NULL, 1, NULL);

}

//= アイドルループ ==

void loop() {}

ーーーーーーーーーーーーーーーーーーーーーーーーー

2026年8月14日金曜日

platformIO esp8266 led-control and dht server

ini are as follows, and the code is as follows: なぜかpcでないとアクセスしにくい、なんで?

[env:d1_wroom_02]
platform = espressif8266
board = d1_wroom_02
framework = arduino
monitor_speed = 115200

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>

#define WIFI_SSID "Pikara2-91d8e4"
#define WIFI_PWD ""

#define LED_PIN 16 // GPIO16 (D0)

ESP8266WebServer server(80);
// HTML fetchでget reqできた
const char HTML[] PROGMEM = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>LED Control</title>
<script>
function ledOn() {
fetch("/led/on");
}

function ledOff() {
fetch("/led/off");
}
</script>
</head>
<body>
<h1>NodeMCU LED Control</h1>
<button onclick="ledOn()">LED ON</button>
<button onclick="ledOff()">LED OFF</button>
</body>
</html>
)rawliteral";


// GET /led/on
void handleLedOn()
{
digitalWrite(LED_PIN, HIGH);
Serial.println("GET /led/on");
server.send(200, "text/plain", "LED ON");
}


// GET /led/off
void handleLedOff()
{
digitalWrite(LED_PIN, LOW);
Serial.println("GET /led/off");
server.send(200, "text/plain", "LED OFF");
}


// GET /
void handleRoot()
{
server.send_P(200, "text/html", HTML);
}


void setup()
{
Serial.begin(115200);

pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW); // 最初はオフで

// WiFi接続
WiFi.begin(WIFI_SSID, WIFI_PWD);

Serial.print("WiFi connecting");

while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}

Serial.println();
Serial.println("Connected!");

Serial.print("IP Address: ");
Serial.println(WiFi.localIP());

// URL登録
server.on("/", HTTP_GET, handleRoot);
server.on("/led/on", HTTP_GET, handleLedOn);
server.on("/led/off", HTTP_GET, handleLedOff);

server.begin();

Serial.println("Web server started");
}


void loop()
{
server.handleClient();
}

------------------------------------------------------------------
#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <DHT.h>

// Wi-Fi設定 (アクセスポイント名とパスワード)
const char* ssid = "ESP8266_AP";
const char* password = "password123";

// DHT11設定
#define DHTPIN 2 // 接続ピン (GPIO2 / D4)
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);

ESP8266WebServer server(80);

void handleRoot() {
float h = dht.readHumidity();
float t = dht.readTemperature();

String html = "<html lang='ja'><head><meta charset='utf-8'>";
html += "<meta http-equiv='refresh' content='5'>"; // 5秒ごとに自動更新
html += "<title>ESP8266 DHT11</title></head><body>";
html += "<h1>ESP8266 温湿度モニター</h1>";
if (isnan(h) || isnan(t)) {
html += "<p>センサーからデータを読み込めません。</p>";
} else {
html += "<p>温度: " + String(t, 1) + " &deg;C</p>";
html += "<p>湿度: " + String(h, 1) + " %</p>";
}
html += "</body></html>";
server.send(200, "text/html", html);
}

void setup() {
Serial.begin(115200);
dht.begin();

// ソフトAPの起動
WiFi.softAP(ssid, password);
IPAddress myIP = WiFi.softAPIP();
Serial.print("AP IPアドレス: ");
Serial.println(myIP);

// Webサーバーのルーティング設定
server.on("/", handleRoot);
server.begin();
Serial.println("Webサーバー開始");
}

void loop() {
server.handleClient();
}


2026年8月13日木曜日

mmbasic 操作一覧 cd pico-sdk / examples

picocom -b 115200 --omap delbs -s "sz --xmodem" /dev/ttyACM0 で転送可能となる 

ctl-a,ctl-xで終了

https://qiita.com/ksakabe/items/2ecfcfd346ef7f857b34 も参考になる

mmbasic picocomでpcからpicoへmmbasicを贈りたいPicoMite (MMBasic) 

を実行中のRaspberry Pi PicoへPCからファイルを転送するには、Pico側のXMODEM RECEIVEコマンドと、picocom のXMODEM送信機能(Ctrl-A 続いて Ctrl-S) を組み合わせて使用します。あらかじめホストPC側に lrzsz(sxコマンド)をインストール。

1.転送の手順PicoMite側で受信待機picocomでPicoに接続します。MMBasicのプロンプトで次のように入力してEnterキーを押します。

XMODEM RECEIVE 

コードは注意してご使用ください。(※画面が止まった/待機状態になったようになります)

picocomからファイルを送信キーボードの

Ctrl-A を押し、続けて Ctrl-Sを押します。画面下部に送信する、そのPCディレクトリのファイルのパス(ファイル名)を尋ねられるので、PC側のファイル名を入力してEnterキーを押すと転送が始まります。

cf 保存されたファイルの一覧を見る

(FILES)SDカードや内蔵フラッシュドライブに保存されているファイル名の一覧を表示します。basic FILES

2. ファイルの中身を画面に表示する

(TYPE)転送されたプログラムの内容が正しいか、テキストとして画面に表示して確認します。basic TYPE "try.bas"

3. プログラムをメモリに読み込んで実行する 

(LOAD RUN)ファイルをメモリにロードして実行します。basic LOAD "try.bas" RUN

4.プログラムをメモリからセーブしてマイコンでfilesできるようにする

(SAVE) basic SAVE "filename.bas"

5.プログラムをその場で編集・確認する

(EDIT)PicoMite内蔵のフルスクリーンエディタでファイルを開きます。basic EDIT "try.bas"

F1 キー(またはCtrl+Q)を押すとメニューが出るので、保存して終了、または保存せずに終了を選べます。

6.メモリ上のプログラムを消去するにはbasic new,

フラッシュ上のプログラムを消去するにはbasic kill  "filename.bas"

----------------------------------------------------------------------------

https://zenn.dev/askua/articles/05e143091c150c :: tinygo for pico

 https://gihyo.jp/admin/serial/01/ubuntu-recipe/0684 :: pico-sdk and pico-sdk-examples


2026年8月10日月曜日

Arduino UnoでSPI通信 温度センサADT7310

https://independence-sys.net/main/?p=3804 より参照
Arduino Unoとは以下のように接続します。
ADT7310 – Arduino 3.3vでもうごくのでラズピコでもOK
CS – Pin10 SS(CS)     chip select マイナス論理
SDI – Pin11 MOSI      sdi:   serial data in
SDO – Pin12 MISO sdo: serial data out
SCL – Pin13 SCK        scl:   serial clock line
VDD – 5V
GND – GND
Arduino UnoのMISO(Master In Slave Out)端子は、SPI通信でセンサー(スレーブ)からデータを受け取る(読み込む)ための入力端子 MOSIはMaster Out Slave Inの略で、
Arduino(マスター)からセンサや周辺機器(スレーブ)へデータを送信(出力)するための端子です。つまりtx,rxのようなクロス結合となっている。I2CはDaisy Chainで全然ちがう。

#include <SPI.h>
 
/*
 * ADT7310での温度データ取得
 * ADT7310 - Arduino
 *  CS  - Pin10 SS(CS)
 *  SDI - Pin11 MOSI
 *  SDO - Pin12 MISO
 *  SCL - Pin13 SCK
 *  VDD - 5V
 *  GND - GND
 */
 
int SSPin = 10; // Pin10をSS
  
// 初期化
void setup(void) {
  pinMode(SSPin, OUTPUT);
  Serial.begin(9600);
  // 以下の3行は呪文やな
  SPI.setBitOrder(MSBFIRST);  //最上位ビット(MSB)から送信
  SPI.setClockDivider(SPI_CLOCK_DIV128); //通信速度を遅く設定
  SPI.setDataMode(SPI_MODE0); //CPOL(クロック極性):0 CPHA(クロックフェーズ):0
 
  SPI.begin();
  
  SetSSPin(LOW); // マイナス論理、0の間だけ通信可能となる
// 本プログラムではループしつづけるのでSetSSPin(High)は不要
 
  //ソフトウェアリセット
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
  SPI.transfer(0xFF);
     
  SPI.transfer(0x54);    // 測定開始(continuously read)
  delay(500);            // 仕様上は、240msで開始
}
  
// メインループ
void loop(void) {
  uint16_t uiVal;
  float fVal;
  int iVal;
  
  uiVal = (uint16_t)SPI.transfer(0) << 8;  // AD変換値 上位
  uiVal |= SPI.transfer(0);                // AD変換値 下位
 
  uiVal >>= 3;                          // シフトで13bit化  
  //uiVal = 0x1fff; //確認テスト用
  
  if(uiVal & 0x1000) {               // 13ビットで符号判定
    iVal = uiVal - 0x2000;         // マイナスの時 (10進数で8192)
  }
  else{
    iVal = uiVal;                 //プラスの時
  }
   
  fVal = (float)iVal / 16.0;           // 温度換算(摂氏)
  Serial.println(fVal, 4);             // シリアル送信
   
  delay(5000);          //例として5秒待つ
}
 
/*
 * SSピンの設定
 * Lowでマスタからの通信が有効(セレクト)
 * (Highではマスタから通信出来ない(無視される)セレクト解除の状態)
 */
void SetSSPin(int val)
{
    digitalWrite(SSPin, val);
}