2026年7月9日木曜日

esp32はplatformIOでコンパイル激速 cf rp2040 freertos using SMP

 https://qiita.com/nextfp/items/f54b216212f08280d4e0を参考にplatformIOをつかう

ちなみにsingle coreのesp8266はarduinoIDEでそこそこ早い。。。

https://lang-ship.com/blog/?s=ESP32%E3%81%AEFreeRTOS%E5%85%A5%E9%96%80#google_vignette 

esp32 reeRTOS tutorial index

Arduino IDEで本当におすすめなのは?
>
> RP2040でArduino IDEを使うなら、Arduino-Pico + FreeRTOS SMPが最も導入しやすく、マルチコア性能も活かしやすい構成です。
>
> もし「Arduino IDEでそのままコンパイルできる、RP2040用FreeRTOSマルチコアの完全なサンプル(LED点滅とSerial出力を2コアで同時実行)」をご希望であれば、そのまま動作するプロジェクト一式をご用意できます。
>
> まずはCORE1,CORE2でLEDブリンク
>
> RP2040では、コア名は Core0 と Core1 です(Core2はありません)。
>
> まずはArduino IDEで、Core0とCore1がそれぞれ別のLEDを点滅する最も簡単なサンプルを紹介します。
>
> Arduino-Pico(Earle Philhowerコア)のマルチコア機能を使う例
>
> この方法はFreeRTOSを使わず、まずマルチコア動作を確認するためのサンプルです。
>
> // Core0: LED_BUILTIN
> // Core1: GP15
>
> const int LED0 = LED_BUILTIN;
> const int LED1 = 15;
>
> //-------------------------
> // Core1で実行される
> //-------------------------
> void setup1() {
>   pinMode(LED1, OUTPUT);
> }
>
> void loop1() {
>   digitalWrite(LED1, HIGH);
>   delay(200);
>   digitalWrite(LED1, LOW);
>   delay(200);
> }
>
> //-------------------------
> // Core0で実行される
> //-------------------------
> void setup() {
>   pinMode(LED0, OUTPUT);
> }
>
> void loop() {
>   digitalWrite(LED0, HIGH);
>   delay(1000);
>   digitalWrite(LED0, LOW);
>   delay(1000);
> }
>
> 動作
>
> Core0
>
> LED_BUILTIN:1秒周期で点滅
>
> Core1
>
> GP15:0.2秒周期で点滅
>
> このプログラムでは、2つのコアが独立して動作していることが確認できます。
>
> ________________________________
>
> 配線
>
> 外付けLEDを使う場合は、
>
> GP15 ---- 330Ω ---->|---- GND
>
> のように接続してください。
>
> ________________________________
>
> 次のステップ(FreeRTOS)
>
> マルチコア動作が確認できたら、次はFreeRTOS SMPを使って、
>
> LED1タスク
> LED2タスク
>
> を作成し、それぞれをCore0・Core1に割り当てる例に進むのがおすすめです。
>
> 確認したいこと
>
> お使いのボードは
>
> Raspberry Pi Pico
> Raspberry Pi Pico W
> Raspberry Pi Pico 2
> Raspberry Pi Pico 2 W
>
> のどれでしょうか?
>
> Arduino IDEでは、Arduino-Pico を使用していますか?(Arduino Mbedコアでは手順が異なります。)
>
> マルチコア動作が確認できたら、次はFreeRTOS SMPを使って、 LED1タスク LED2タスク を作成し、それぞれをCore0・Core1に割り当てる例
>
> はい。RP2040でFreeRTOS SMPを使い、2つのLEDタスクをそれぞれCore0とCore1で動かす例を示します。
>
> 前提
>
> ボード:Raspberry Pi Pico / Pico W(RP2040)
> Arduino IDE
> Arduino-Pico
> FreeRTOSライブラリが有効
>
> サンプル
>
> #include <Arduino.h>
> #include <FreeRTOS.h>
> #include <task.h>
>
> #define LED0 LED_BUILTIN
> #define LED1 15
>
> TaskHandle_t task0Handle;
> TaskHandle_t task1Handle;
>
> void task0(void *pvParameters)
> {
>     pinMode(LED0, OUTPUT);
>
>     while (1) {
>         digitalWrite(LED0, !digitalRead(LED0));
>         vTaskDelay(pdMS_TO_TICKS(1000));
>     }
> }
>
> void task1(void *pvParameters)
> {
>     pinMode(LED1, OUTPUT);
>
>     while (1) {
>         digitalWrite(LED1, !digitalRead(LED1));
>         vTaskDelay(pdMS_TO_TICKS(250));
>     }
> }
>
> void setup()
> {
>     Serial.begin(115200);
>
>     xTaskCreate(
>         task0,
>         "LED0",
>         256,
>         NULL,
>         1,
>         &task0Handle);
>
>     xTaskCreate(
>         task1,
>         "LED1",
>         256,
>         NULL,
>         1,
>         &task1Handle);
>
>     // Core0に固定
>     vTaskCoreAffinitySet(task0Handle, (1 << 0));
>
>     // Core1に固定
>     vTaskCoreAffinitySet(task1Handle, (1 << 1));
> }
>
> void loop()
> {
>     // FreeRTOSが動作するので空
> }
>
> 動作
>
> Core0
>
> LED_BUILTIN:1秒周期で点滅
>
> Core1
>
> GP15:250ms周期で点滅
>
> これで2つのタスクが異なるコアで実行されます。
>
> ________________________________
>
> もし vTaskCoreAffinitySet() が見つからない場合
>
> 実は、Arduino-Picoに含まれるFreeRTOSのバージョンによっては、このAPIがありません。
>
> その場合は別の方法でコアを指定する必要があります。
>
> 確認したいこと
>
> Arduino IDEで使用している
>
> Arduino-Picoコアのバージョン(例:5.2.0など
>
> を教えてください。
>
> また、**「スケッチ → ライブラリをインクルード」**に FreeRTOS は表示されていますか?
>
> その情報が分かれば、お使いの環境に合った確実にコンパイルできるサンプルをお示しします。
>
> で実行できます。
> > [1, 2]
> > ________________________________
> > FreeRTOS SMPの基本設定
> > FreeRTOSの標準機能としてSMPがサポートされています。マルチコアを有効にするためには、プロジェクト内の
> > FreeRTOSConfig.h で以下の設定を変更します。 [1]
> > 
> >
> > #define configNUMBER_OF_CORES 2
> >
> > コードは注意してご使用ください。
> > これにより、OSが両方のコアを認識し、優先度の高いタスクから順に空いているコアへ割り当てて実行するようになります。 [1]
> > タスクの実行コアを固定する方法(コア・アフィニティ)
> > 特定のタスクを必ず「Core0」または「Core1」で動かしたい場合は、タスク・アフィニティ(Task Affinity)を設定します。
> > FreeRTOSが用意している vTaskCoreAffinitySet API関数を使用します。 [1, 2]
> > c
> >
> > TaskHandle_t xTaskHandle;
> >
> > // タスクを生成
> > xTaskCreate(vTaskCode, "TaskName", STACK_SIZE, NULL, PRIORITY, &xTaskHandle);
> >
> > // Core1(インデックス 1)にタスクを固定する
> > vTaskCoreAffinitySet(xTaskHandle, (1 << 1));
> >
> > コードは注意してご使用ください。
> >
> > (1 << 0): Core0に固定
> > (1 << 1): Core1に固定
> > (1 << 0) | (1 << 1): どちらのコアでも実行可能(デフォルト)
> >
> > 開発時の注意点
> >
> > 排他制御の徹底
> > マルチコア環境では、2つのタスクが同時に動くため、グローバル変数の読み書きや周辺回路(I2CやSPIなど)へのアクセスが衝突する可能性があります。必ず
> > Mutex(ミューテックス) や セマフォ を使用してリソースを保護してください。 [1, 2, 3]
> > デッドロックの回避
> > RP2040でFreeRTOSを使用する際、メモリ管理方式(heap_3など)によってはSDKのメモリ管理とOSのロック機構が衝突しデッドロックを引き起こす場合があります。heap_4
> > または heap_5 の利用が推奨されます。 [1, 2, 3]
> >
> > 実装例と詳細情報
> > 詳細な実装方法やキュー(Queue)を用いたタスク間の通信方法については、以下の資料や記事が参考になります。 [1, 2]
> >
> > 複数タスクの実行とコアの割り当てについては、Qiita - RP2040マルチコア #FreeRTOS で解説されています。
> > マルチコアOSの挙動や仕組みの概要は、オープンソースカンファレンスの資料 が分かりやすいです。
> > タスク実行の基本的な概念やスケジューラについては、note - Raspberry Pi Picoのマルチコア機能をつかう を確認してみましょう。

2026年7月7日火曜日

OBNIZ JAVASCRIPT DOUBOLE-DC-MOTORS CONTROL

スマホか2IN1でツーポイントタッチで操作する!

赤字部分が核心部分である!JQUERYでA REFを操作して飛んでいった先でDCモータを操作 

<!DOCTYPE html>

<html>
<head>
<meta charset="UTF-8" />
<title>obniz App</title>
<meta
name="viewport"
content="width=device-width, initial-scale=1, shrink-to-fit=no"
/>
<link
rel="stylesheet"
href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css"
crossorigin="anonymous"
/>
<link
href="https://use.fontawesome.com/releases/v5.5.0/css/all.css"
rel="stylesheet"
crossorigin="anonymous"
/>
<link
rel="stylesheet"
type="text/css"
href="https://obniz.com/css/app-common.css"
/>

<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://obniz.com/js/popper-1.12.9/popper.min.js"></script>
<script src="https://obniz.com/js/bootstrap-4.0.0/bootstrap.min.js"></script>
</head>

<body>
<nav class="navbar navbar-expand-sm nav-app">
<a class="navbar-brand" href="/webapp">obniz WebApp</a
>
<ul class="navbar-nav ml-auto">
<li class="nav-item">
<a
class="nav-link"
href="/webapp/6?appFlow"
><i class="far fa-question-circle"></i>&nbsp;<span class="sm-none"
>How to Use</span
></a
>
</li>
</ul>
<a href="/console/webapp"
><i class="far fa-times-circle"></i>&nbsp;END</a
>
</nav>

<script src="https://unpkg.com/obniz@3.1.0/obniz.js" crossorigin="anonymous"></script>
<style>
.control-set{
margin: 0 auto;
}
.control-set button{
background-color: #A9AAAA;
position: relative;
padding: 2rem 2.5rem;
font-size: 30px;
margin-bottom: 10px;
border-bottom: solid 2px #3E3A39;

}
.control-set button:hover{
background-color: #00A4E3;
color: #FFF;
-webkit-transform: translateY(2px);
transform: translateY(2px); /*下に動く*/
border-bottom: none;
}

.control-set {
text-align: center;
max-width: 800px;
margin: 0 auto;
}
</style>
<link href="https://use.fontawesome.com/releases/v5.5.0/css/all.css" rel="stylesheet" integrity="sha384-B4dIYHKNBt8Bc12p+WXckhzcICo0wtJAoU8YZTY5qE0Id1GSseTk6S+L3BlXeVIU" crossorigin="anonymous">
<div id="obniz-debug"></div>
<div class="container app-content">
<div class="app-content_head">
<h1>RC car Controller</h1>
</div>
<div class="app-content_body">
<div class="bg-white app-content_body-inner">
<div class="control-set">
<button id="lf" class="btn"><i class="fas fa-arrow-up"></i></button>
<button id="rf" class="btn"><i class="fas fa-arrow-up"></i></button><br/>
<button id="lb" class="btn"><i class="fas fa-arrow-down"></i></button>
<button id="rb" class="btn"><i class="fas fa-arrow-down"></i></button>
</div>
<script>
var obniz = new Obniz("OBNIZ_ID_HERE");
obniz.onconnect = async function () {
var motorA = obniz.wired("DCMotor", {forward:3, back:2});
motorA.power(40);
var motorB = obniz.wired("DCMotor", {forward:0, back:1});
motorB.power(40);

$("#lf").on('touchstart mousedown', ()=>{
motorA.move(true);
})
$("#lf").on('touchend mouseup',()=>{
motorA.stop();
})
$("#lb").on('touchstart mousedown',()=>{
motorA.move(false);
})
$("#lb").on('touchend mouseup',()=>{
motorA.stop();
})
$("#rf").on('touchstart mousedown',()=>{
motorB.move(true);
})
$("#rf").on('touchend mouseup',()=>{
motorB.stop();
})
$("#rb").on('touchstart mousedown',()=>{
motorB.move(false);
})
$("#rb").on('touchend mouseup',()=>{
motorB.stop();
})
}

</script>
</div>
</div>
</div>
</body>
</html>

2026年6月27日土曜日

mmbasic on ウィンドウズよろし、linux。。。。

OPTION WIFI ssid, passwordでwifi設定(プログラム実行はできない、コマンドラインで)

PRINT MM.INFO(IP ADDRESS)でDHCPでゲットしたIPを確認する

WEB NTP 9,"162.159.200.123"で成功した!

  • 9 は日本標準時 (JST, UTC+9) です。
  • -10 はハワイ時間なので、日本で使うなら 9 が適切です


teraterm 38400 baud , cr lf,でeditにはいる前にnewで全部消去、あとはペースト可

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

https://qiita.com/ksakabe/items/f14c89bdbeeadb3848ea でmmbasic on linux記事あり

edit終了はctlC,picocom 終了はctla+ctlx

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

sudo picocom -b 115200 --omap delbs /dev/ttyACM0

これでeditでバックスペースが効くようになる

picocomでローカルエコーを外す(無効にする)には、オプションを何も付けずに起動するか、明示的に無効化するキー操作を行います。

実は picocom標準(デフォルト)でローカルエコーが「オフ」になっています。そのため、起動コマンドに --echo を付けなければ自動的にオフになります。
1. コマンドで外す方法(標準状態)
何もオプションを付けずに起動します。
bash
sudo picocom -b 115200 /dev/ttyACM0
コードは注意してご使用ください。
2. 起動中にキー操作で切り替える方法
すでに接続している画面の中で、ローカルエコーのオン/オフをリアルタイムに切り替えることができます。
  1. Ctrl + A を押します(picocomのコマンドモードに入ります)。
  2. その後に Ctrl + C を押します。
画面に [local echo is commands/off] のように表示され、ローカルエコーが切り替わります。入力した文字が2重に表示される場合は、このキー操作を一度試してみてください。
3. それでも2重に入力される場合
もし picocom のローカルエコーをオフにしても文字が2重に表示される場合は、MMBasic(デバイス)側が入力された文字をそのまま送り返して(エコーバックして)いる状態です。
その場合は、MMBasicのプロンプトで以下のコマンドを実行して、デバイス側のエコー設定を変更してください。
basic
OPTION ECHO OFF
コードは注意してご使用ください。
これらを実行しても入力がうまくいかない、または画面が崩れてしまうなど、現在の具体的な症状(文字が2重になる、何も表示されない、など)を教えていただけますか?状況に合わせた解決策をご案内します。
あなたが話した内容: editでバックスペースがききません
MMBasicの内蔵エディタ(EDITコマンド)でバックスペースキーが効かない原因は、Linuxのターミナルが送信しているキーコード(DEL / 0x7f)と、MMBasicが期待しているコード(BS / 0x08)が一致していないためです。 [1, 2]
以下のいずれかの方法で解決できます。最も手軽な 対処法1(オプション追加) をまずお試しください。