2025年12月31日水曜日

毒書案内:読んではいけない35冊+中国2冊

  1.  〇太宰治『人間失格』人間として生きられない人間の悲惨な生涯
  2. 〇ヨーハン・ヴォルフガング・ゲーテ『若きウェルテルの悩み』善女の顔をした悪女に殉ずる青年の悲劇
  3. ▽ルイス・キャロル『不思議の国のアリス』 少女というトリックスターの異界めぐり 青空電子あり、完遂?
  4. ▽沼正三『家畜人ヤプー』マゾヒストの奇想が構築した倒錯のユートピア 有料電子あり 県で完遂?
  5. 〇安部公房『砂の女』 砂の世界に囚われた失踪者の新しい日常
  6. 〇フランツ・カフカ『審判』自分の知らない罪によって裁かれる恐怖
  7. ▽埴谷雄高『死霊』嗜好の実験室で培養された観念小説の極北 第一巻で挫折。。。
  8. ▽夢野久作『ドグラ・マグラ』読者の現実感覚を崩壊させる記憶の迷宮 世界観を知る意味で代替『瓶詰地獄』を読んだ
  9. 〇アルチュール・ランボー『地獄の季節』 鮮烈なイメージが炸裂する天才の散文詩
  10. 〇フリードリッヒ・ニーチェ『ツァラストゥストラ』 読者の魂を焼き尽くす神なき世界の黙示録
  11. 〇三島由紀夫『金閣寺』 美を滅ぼすことに憑かれた青年僧の告白
  12. 〇大岡昇平『野火』 戦争という狂気が生み出す人肉食の悪夢
  13. 〇ウィリアム・フォークナー『サンクチュアリ』 「聖域」で繰り広げられる変質者の陰惨な暴力
  14. 〇中上健次『千年の愉楽』 「路地」に生まれた若者たちの沸騰する生と死
  15. 〇川端康成『眠れる美女』死臭漂う宿で老人たちが営む性の秘儀
  16. 〇ウラジミール・ナボコフ『ロリータ』中年男を「萌え」させるニンフェットの魔力
  17. 〇江戸川乱歩『芋虫』人間が人間であることの極限に触れた短篇
  18. ジョルジュ・バタイユ『眼球譚(がんきゅうたん)』読者に嫌悪と嘔吐を催させる究極の背徳
  19. @永山則夫『無知の涙』 獄中で自我に目覚めた連続射殺魔の手記 有料電子 県立在庫
  20. @アドルフ・ヒトラー『わが闘争』 世界を破滅へと導いた反ユダヤ思想のバイブル300頁 有料電子 県立在庫
  21. @マルキ・ド・サド『悪徳の栄え』残虐行為の快楽を称揚する悪の哲学 有料電子 県立在庫
  22. @ウィリアム・バロウズ『裸のランチ』 麻薬常習者の錯乱が生み出すおぞましい幻覚 手元あり
  23. @河野多恵子『幼児狩り』幼い男児を物色する女の歪んだ欲望 『ミイラ取り猟奇譚』 手元あり
  24. @ジャン・ジュネ『ブレストの乱暴者』男色泥棒作家 代替『泥棒日記』 手元あり
  25. @ロートレアモン『マルドロールの歌』 野生の言語が繰り広げる荒唐無稽な幻想文学 手元あり
  26. @大江健三郎『われらの時代』 疾走する文体で読者を揺さぶる挑発的作品 手元あり
  27. @ヘンリー・ミラー『北回帰線』性の躍動と欲望の噴出を歌い上げる言葉の奔流! 手元あり
  28. @ライナー・マリア・リルケ『マルテの手記』 パリを彷徨する孤独な青年の心象風景 キンドルで読書中
  29. @原口統三『二十歳のエチュード』少年少女の夭折(ようせつ)願望を刺激する若き魂の記録 キンドルで読書中
  30. @谷崎潤一郎『鍵・瘋癲(ふうてん)老人日記』 観念の世界で欲望を駆り立てる男たちの痴態 Kobo読書中
  31. @島尾敏雄『死の棘(とげ)』 夫婦の愛憎の極限を描く凄惨な私小説 読書中
  32. @フョードル・ドストエフスキー『地下室の手記』 自意識の病を分析する「ニート」の独白 電子もあるが古典新訳で読書中
  33. @ジャン=ジャック・ルソー『孤独な散歩者の夢想』生と死の境界線を消滅させる甘美な思索の書 岩波ワイドで読書中
  34. @トーマス・マン『ヴェニスに死す』少年の妖しい美に魅せられた中年作家の死 古典新訳で読書中
  35. 中国がらみ @エン・レンカ 『四書』 1956年の百花斉放百家争鳴、その後の大躍進政策を風刺するディストピア、一時毛沢東は失脚するも1966年に文化大革命で復権、1977年鄧小平の完全復権にて1989年に天安門事件、2020年に習近平の香港領土化
  36. 中国がらみ @高行健 『ある男の聖書』 文革で紅衛兵だったころの自伝
  37. そのほか 田舎司祭の日記、ミドルマーチ、エジプト、徒然草、テス、マンスフィールド
  38. 購入予定 ラクダのシャンツ、寒い夜、

2025年12月26日金曜日

PICO Wで音出し cf 加速度・角速度は未はんだ(倒立振り子用)メムマイク

 mp3player,audio recorder,human voice synthesizerは成功ずみ,memsマイクは未踏、max98357は2個とも実施後にusb interfaceがあかんようになり再起動必要であきらめた

結局単純なドレミでOK牧場とした

from machine import Pin, PWM

import utime

# GP0をPWM出力に設定

buzzer = PWM(Pin(0))

# 音階と周波数の対応表 (Hz)

notes = {

    'do': 262,

    're': 294,

    'mi': 330,

    'fa': 349,

    'so': 392,

    'la': 440,

    'si': 494,

    'do2': 523

}


def play_tone(frequency, duration):

    if frequency == 0:

        buzzer.duty_u16(0) # 無音(休符)

    else:

        buzzer.freq(frequency) # 周波数を設定

        buzzer.duty_u16(32768) # デューティ比50%で音を鳴らす

    

    utime.sleep_ms(duration)

    buzzer.duty_u16(0) # 音を止める

    utime.sleep_ms(50) # 音の切れ目を作るための短い休止


# ドレミファソラシドを順番に鳴らす

scale = ['do', 're', 'mi', 'fa', 'so', 'la', 'si', 'do2']


for note in scale:

    print(f"Playing: {note}")

    play_tone(notes[note], 400) # 各音を400ms鳴らす


# プログラム終了時に確実に止める

buzzer.deinit()

ーーーーーーーーーちょうちょは以下のごとしーーーーーーーーーーーーーーーーーーーー

from machine import Pin, PWM

import utime


buzzer = PWM(Pin(0))


# ハ長調

notes = {

    'C': 262,

    'D': 294,

    'E': 330,

    'F': 349,

    'G': 392,

    'A': 440,

    'C2': 523,   # 高いド

    'rest': 0

}


def play(f, t):

    if f == 0:

        buzzer.duty_u16(0)

    else:

        buzzer.freq(f)

        buzzer.duty_u16(32768)

    utime.sleep_ms(t)

    buzzer.duty_u16(0)

    utime.sleep_ms(40)


# 🦋 ちょうちょ ちょうちょ

melody = [

    ('G', 400), ('E', 400), ('E', 800),

    ('F', 400), ('D', 400), ('D', 800),


    # なーのはに とーまれ

    ('C', 400), ('D', 400), ('E', 400), ('F', 400),

    ('G', 800),


    ('rest', 400)

]


for n, t in melody:

    play(notes[n], t)


buzzer.deinit()


Pico W + MAX98357A(chatgpt) https://www.otosozai.com/se1_1.htmlよりステレオ音源とったが、、、

一度はうごいたがその後無音に。。。。製品が2個とも悪いのかも、あきらめた

 **「ステレオ WAV でも再生できる」**ようにします。

やり方は ステレオ → モノラルにソフトで変換(L+R を平均)して I2S に流す方式です。
👉 MAX98357A が モノラル接続でも確実に鳴る一番安全な方法です。


方針(重要)

  • WAV が

    • モノラル → そのまま再生

    • ステレオL/R を平均してモノラル化して再生

  • 対応フォーマット

    • PCM

    • 16bit

    • mono / stereo 両対応


ステレオ対応版:WAV 再生コード(Pico W + MAX98357A)

from machine import Pin, I2S import struct # ============================== # I2S ピン設定 # ============================== BCLK_PIN = 10 # GP10 WS_PIN = 11 # GP11 DIN_PIN = 12 # GP12 WAV_FILE = "test.wav" # ============================== # WAV ヘッダ解析 # ============================== def read_wav_header(f): if f.read(4) != b'RIFF': raise ValueError("RIFF形式ではありません") f.read(4) if f.read(4) != b'WAVE': raise ValueError("WAVE形式ではありません") # fmt チャンク探索 while True: cid = f.read(4) size = struct.unpack("<I", f.read(4))[0] if cid == b'fmt ': fmt = f.read(size) break else: f.seek(size, 1) audio_format, channels, sample_rate = struct.unpack("<HHI", fmt[:8]) bits = struct.unpack("<H", fmt[14:16])[0] print("==== WAV 情報 ====") print("チャンネル数 :", channels) print("ビット深度 :", bits) print("サンプル周波数:", sample_rate, "Hz") if audio_format != 1: raise ValueError("PCM形式のみ対応") if bits != 16: raise ValueError("16bitのみ対応") if channels not in (1, 2): raise ValueError("mono / stereo のみ対応") # data チャンク探索 while True: cid = f.read(4) size = struct.unpack("<I", f.read(4))[0] if cid == b'data': return sample_rate, channels, size else: f.seek(size, 1) # ============================== # ステレオ → モノラル変換 # ============================== def stereo_to_mono(data): out = bytearray(len(data) // 2) for i in range(0, len(data), 4): l = struct.unpack_from("<h", data, i)[0] r = struct.unpack_from("<h", data, i + 2)[0] m = (l + r) // 2 struct.pack_into("<h", out, i // 2, m) return out # ============================== # WAV 再生 # ============================== with open(WAV_FILE, "rb") as f: rate, channels, data_size = read_wav_header(f) audio = I2S( 0, sck=Pin(BCLK_PIN), ws=Pin(WS_PIN), sd=Pin(DIN_PIN), mode=I2S.TX, bits=16, format=I2S.MONO, rate=rate, ibuf=40000 ) print("▶ 再生開始") BUF_SIZE = 1024 * (2 if channels == 2 else 1) remaining = data_size while remaining > 0: raw = f.read(min(BUF_SIZE, remaining)) if not raw: break if channels == 2: raw = stereo_to_mono(raw) audio.write(raw) remaining -= len(raw) audio.deinit() print("■ 再生終了")
-------------------------------------------------------------

2025年12月24日水曜日

TB6612使用 Dual DCモータードライブキット 秋月 (uno/pic)

 akizukidenshi.com は、ピンの位置が微妙にずれているので要注意

真ん中の3本がgnd,stby,vccになっている stbyはポジティブにセットしておく方法とプログラムでセットするやり方がある、後者のほうがベターだが配線がめんどい 以後は前者

const int motorPWM = 3;

const int motorAin1 = 4;

const int motorAin2 = 5;

int motorSpeed = 100; // pwmのデューティ比で0~255で調整

void setup() {

   // declare pin 9 to be an pwm output:

   pinMode(motorPWM, OUTPUT);

   pinMode(motorAin1, OUTPUT);

   pinMode(motorAin2, OUTPUT);

}


void loop() {

  analogWrite(motorPWM, motorSpeed);

  digitalWrite(motorAin1, LOW);

  digitalWrite(motorAin2, HIGH);

  delay(3000);

  digitalWrite(motorAin1, HIGH);

  digitalWrite(motorAin2, LOW);

  delay(3000);

}



2025年12月21日日曜日

pic16f18325 no-mcc aqm0802

http://machoto2.g2.xrea.com/page/P16F18325/P18325_M01.htm ばっちり動いた

 main.c

/*********************************************************************
 * データをLCDに表示する。 1MHz (内部クロック)
 * RC5 SCL
 * RC4 SDA
 *
 * PIC16F18325  MPLAB X IDE with XC8
 * Copyright (c) 2017 iwamoto All Rights Reserved
 * *******************************************************************/
#define _XTAL_FREQ 1000000

#include <xc.h>
#include <stdio.h>
#include "LCDi2c.h"
//******************* コンフィグレーション ****************************
#pragma config FEXTOSC = OFF,RSTOSC = HFINT1  // HFINTOSC (1MHz)
#pragma config CLKOUTEN = OFF,CSWEN = ON,FCMEN = OFF
#pragma config MCLRE = OFF,PWRTE = OFF,WDTE = OFF,LPBOREN = OFF
#pragma config BOREN = OFF,BORV = LOW,PPS1WAY = OFF,STVREN = ON
#pragma config DEBUG = OFF
#pragma config WRT = OFF,LVP = OFF,CP = OFF,CPD = OFF

// ******************* main ******************************************
void main() {
    i2c_int();
    LCD_int();                  // LCDを初期化
    printf("LCD Test");
    LCD_posyx(1,1);             // 下段にカーソル移動
    printf("%04X",0x12AB);      // 数値をHEX表示する
    while(1);
}

LCDi2c.h

/*
 * File:   LCDi2c.h
 *  データをLCDに表示する。
 *    秋月(ACM1602NI)I2C LCD表示器を使用
 *          1MHz (内部クロック)
 * RC5 SCL
 * RC4 SDA
 *
 * PIC16F18325  MPLAB X IDE with XC8
 * Copyright (c) 2017 iwamoto All Rights Reserved
 ** Author: ki
 * Created on October 21, 2017, 11:53 AM
 */

#ifndef _XTAL_FREQ
#define _XTAL_FREQ 1000000
#endif

 //*************************************************
 //  調整用定数
 //*************************************************
 #define CONTRAST  0x28          // for 3.3V
 // #define CONTRAST  0x18       // for 5.0V


 // プロトタイプ *******************************
 void i2c_int(void);
 void i2cByteWrite(char, char, char);
 void i2cTxData(char);
 void LCD_dat(char);
 void LCD_cmd(char);
 void LCD_clr(void);
 void LCD_posyx(char,char);
 void LCD_int(void);

 void LCD_str(char *);
 void LCD_ROMstr(const char *);

LCDi2c.c

/* ************************************
 *  File:   LCDi2c.c
 * プログラム例
 *      int a = 1234;
 *      printf("%d %o %x\n", a, a, a);
 *      printf("%s %c\n", "abc", 'x');
 * 結果 -------------------------------
 *      1234 2322 4d2
 *      abc x
 * *************************************/
#include <xc.h>
#include <stdio.h>
#include "LCDi2c.h"

//******************************************************
// LCD で printf関数が使用できるようにするため putch を設定する
//******************************************************
void putch(char data) {
        LCD_dat(data);      // LCD への一文字表示関数
}

//******************************************************
// I2C 関連 RC5 SCL, RC4 SDA
//******************************************************
void i2c_int(void){
    TRISC4 = 1;             // RC4を入力にする
    TRISC5 = 1;             // RC5を入力にする
    ANSC4  = 0;             // RC4をデジタルIO
    ANSC5  = 0;             // RC5をデジタルIO
    ODCC4  = 1;             // RC4をオープンドレイン
    ODCC5  = 1;             // RC5をオープンドレイン
    LATC4  = 1;             // RC4をオープンにする
    LATC5  = 1;             // RC5をオープンにする
    WPUC4  = 1;             // RC4弱プルアップ ON
    WPUC5  = 1;             // RC5弱プルアップ ON
    RC4PPS     = 25;        // RC4をDAT出力に指定
    RC5PPS     = 24;        // RC5をCLK出力に指定
    SSP1DATPPS = 0x14;      // RC4をDATに入力指定
    SSP1CLKPPS = 0x15;      // RC5をCLK入力に指定

    // SSP1設定 ------------------------------------------
    SSP1STAT = 0b10000000;     // スルーレート制御はOff
    SSP1ADD  = 1;              // クロック設定 125k@1MHz
    SSP1CON1 = 0b00101000;     // I2C Master modeにする
}
//-------- ByteI2C送信
void i2cByteWrite(char addr, char cont, char data){
    SSP1CON2bits.SEN = 1;      // Start condition 開始
    while(SSP1CON2bits.SEN);   // Start condition 確認
    i2cTxData(addr);           // アドレス送信
    i2cTxData(cont);           // 制御コード送信
    i2cTxData(data);           // データ送信
    SSP1CON2bits.PEN = 1;      // Stop condition 開始
    while(SSP1CON2bits.PEN);   // Stop condition 確認
}
//-------- Data送信
void i2cTxData(char data){
    PIR1bits.SSP1IF = 0;       // 終了フラグクリア
    SSP1BUF = data;            // データセット
    while(!PIR1bits.SSP1IF);   // 送信終了待ち
}
//********************************************************
// LCD 関連
//********************************************************
//-------- 1文字表示
void LCD_dat(char chr){
    i2cByteWrite(0x7C, 0x40, chr);
    __delay_us(50);            // 50μsec
}
//-------- コマンド出力
void LCD_cmd(char cmd){
    i2cByteWrite(0x7C, 0x00, cmd);
    if(cmd & 0xFC)             // 上位6ビットに1がある命令
        __delay_us(50);        // 50usec
    else
        __delay_ms(2);         // 2msec ClearおよびHomeコマンド
}
//-------- 全消去
void LCD_clr(void){
    LCD_cmd(0x01);             //Clearコマンド出力
}
//-------- カーソル位置指定
void LCD_posyx(char ypos, char xpos){
    unsigned char pcode;
    switch(ypos & 0x03){
        case 0:    pcode=0x80;break;
        case 1:    pcode=0xC0;break;
    }
    LCD_cmd(pcode += xpos);
}
//-------- 初期化
void LCD_int(void){
    __delay_ms(100);
    LCD_cmd(0x38);             // 8bit 2行 表示命令モード
    LCD_cmd(0x39);             // 8bit 2行 拡張命令モード
    LCD_cmd(0x14);             // OSC  BIAS 設定1/5
                               // コントラスト設定
    LCD_cmd(0x70 + (CONTRAST & 0x0F));
    LCD_cmd(0x5C + (CONTRAST >> 4));
    LCD_cmd(0x6B);             // Ffollwer
    __delay_ms(100);
    __delay_ms(100);
    LCD_cmd(0x38);             // 表示命令モード
    LCD_cmd(0x0C);             // Display On
    LCD_cmd(0x01);             // Clear Display
}
//-------- 文字列出力
void LCD_str(char *str){
    while(*str)                //文字列の終わり(00)まで継続
        LCD_dat(*str++);       //文字出力しポインタ+1
}
//-------- Rom 文字列出力
void LCD_ROMstr(const char *str){
    while(*str)                //文字列の終わり(00)まで継続
        LCD_dat(*str++);       //文字出力しポインタ+1
}

2025年12月20日土曜日

HSPのhspext.asは超便利

#include "hspext.as"

    com_port = 10 ; arduinoのシリアルモニタは使えなくなる

    com_baud = "baud=9600 parity=N data=8 stop=1"

    comopen com_port, com_baud

    if stat != 0 : dialog "COMポートを開けませんでした。": end

    mes "COM" + com_port + " を開きました。"

    ; --- 重要:Arduinoがリセットから立ち上がるのを待つ --- これがないと

ArduinoはPCから接続(comopen)された瞬間に再起動(リセット)がかかります。

    mes "Arduinoの準備を待っています..."

    wait 300  ; 3秒間待機(これがないと送信データが無視されます)

再起動中のArduinoはデータを受け取れないため、送信前に待ち時間を入れる必要があります。

    ; --- データの送信 ---

    comput "Hello HSP3.7"

    mes "データを送信しました。LEDが4秒間光るはずです。"

    ; 送信が物理的に完了するまで少し待ってから閉じる

    wait 100 

    comclose

    mes "ポートを閉じました。"

    stop

----------------対応arduino code-----------------

void setup() {
  // 内蔵LED(13番ピン)を出力モードに設定
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW); // 最初は消灯
  // HSP側の設定に合わせて 9600bps で開始
  Serial.begin(9600);
}

void loop() {
  // シリアルバッファにデータが届いているか確認
  if (Serial.available() > 0) {
    // 送信された文字列を読み取る
    String data = Serial.readString();
    // 受信した文字列に "Hello HSP3.7" が含まれているか判定
  // これならcr/lf処理が省けるので便利
    if (data.indexOf("Hello HSP3.7") != -1) {
      digitalWrite(LED_BUILTIN, HIGH); // LEDを点灯
      delay(4000);
      digitalWrite(LED_BUILTIN, LOW);
    }
  }
}


2025年12月18日木曜日

aqm1602 on pic16f18857(gokan IOT pedia)

 /***********IOT 3.2.1yori*******************************

 *  I2C接続のセンサとLCDを使う mccだけでOK すばらしい

 *  温湿度、気圧の表示

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

#include "mcc_generated_files/mcc.h"

#include "mcc_generated_files/examples/i2c1_master_example.h"

//#include "mcc_generated_files/weather.h"

// 変数定義

uint8_t Flag;

double temp, humi, pres;

char Line1[17], Line2[17]; // aqm1602は16x2 17は多すぎ

char Line1[]="0123456789012345";

char Line2[]="0000000000000000";

// 液晶表示器 コントラスト用定数

//#define CONTRAST  0x18    // for 5.0V

#define CONTRAST  0x25        // for 3.3V  bme280併用時はこれで

// 関数プロト

void lcd_data(char data);

void lcd_cmd(char cmd);

void lcd_init(void);

void lcd_str(char * ptr);

/***** タイマ0割り込み処理関数******/

void TMR0_Process(void){

    Flag = 1;

}

/***** メイン関数 ******/

void main(void)

{

    SYSTEM_Initialize();                    // システム初期化

    TMR0_SetInterruptHandler(TMR0_Process);

    INTERRUPT_GlobalInterruptEnable();

    INTERRUPT_PeripheralInterruptEnable();    

    lcd_init();                             // LCD初期化

    /****** メインループ ************/

    while (1)

    {    

        if(Flag == 1){

            Flag = 0;

            /** センサデータ読み出し **/

            //Weather_readSensors();

            //temp = Weather_getTemperatureDegC();

           // humi = Weather_getHumidityRH();            

            //pres = Weather_getPressureKPa() * 10;

            // 表示データ編集

           

           // sprintf(Line1, "T=%2.1fC  H=%2.1f%%", temp, humi);

           //              sprintf(Line2, "P=%4.1f hPa", pres);

            // LCD表示

            lcd_cmd(0x80);                      // 1行目

            lcd_str(Line1);

            lcd_cmd(0xC0);                      // 2行目

            lcd_str(Line2);

        }

    }

}

/****** 液晶表示器ライブラリ ***************/

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

* 液晶へ1文字表示データ出力

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

void lcd_data(char data){

    I2C1_Write1ByteRegister(0x3E, 0x40, data); 

    __delay_us(30);                             // 処理待ち遅延

}

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

* 液晶へ1コマンド出力

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

void lcd_cmd(char cmd){

    I2C1_Write1ByteRegister(0x3E, 0x00, cmd);

    /* ClearかHomeのとき長遅延 */

    if((cmd == 0x01)||(cmd == 0x02))

        __delay_ms(2);                  // 2msec待ち

    else

        __delay_us(30);                 // 30μsec待ち

}

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

* 液晶表示器 文字列表示関数

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

void lcd_str(char * ptr){

    while(*ptr != 0)                    // 文字列最後まで

        lcd_data(*ptr++);               // 文字表示実行

}

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

*  液晶表示器 初期化関数

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

void lcd_init(void){

    __delay_ms(150);                    // ハード初期化待ち

    lcd_cmd(0x38);                      // 8bit 2line Normal mode

    lcd_cmd(0x39);                      // 8bit 2line Extend mode

    lcd_cmd(0x14);                      // OSC 183Hz BIAS 1/5

    /* コントラスト設定 */

    lcd_cmd(0x70 + (CONTRAST & 0x0F));

    lcd_cmd(0x5C + (CONTRAST >> 4));

//    lcd_cmd(0x6B);                    // Follower for 5.0V

    lcd_cmd(0x6B);                      // Follwer for 3.3V

    __delay_ms(300);

    lcd_cmd(0x38);                      // Set Normal mode

    lcd_cmd(0x0C);                      // Display On

    lcd_cmd(0x01);                      // Clear Display

}


hsp37のwifiサーバ

hsp37ではtcp-serverの切断は原則ない! 

 #include "hspsock.as"

port = 12345

sdim buf, 1024

dim position

title "HSP TCP Server"

sockmake 0, port

if stat != 0 : dialog "ポートを開けません": end

mes "12345で待機中..."

*main

    sockwait 0

    if stat == 0 {

        mes "接続されました"

        goto *recv

    }

    wait 10

    goto *main


*recv

    sockget buf, 1024, 0

    if buf != "" {

        position = 0

        getstr buf, buf, position, 10 ; 10は

        mes buf

        if buf = "ledon"  : mes "LED ON"

        if buf = "ledoff" : mes "LED OFF"

        sockput "OK\n", 0

        buf = ""

    }

    wait 10

    goto *recv



2025年12月14日日曜日

hstp37/dolittle//xcratch/mitapp(other page) on windows with arduino

 hsp37ではarduino.asが同梱されておりstandardfirmata.inoでうごく

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

xcratchはstandardfirmata.inoでうごく

 !が出ている場合はcomを選択してopen!  でないとgpioが制御できない

-----------------------ドリトル通信は--firmataでない--------------------------------------------------

WebAPI 完動:getでjsonを返すサーバを書けばいいだけ

  • WebAPIサーバにアクセスして情報を取得するためのオブジェクトです。
  • GETでのリクエストに対応しています。
  • オンライン版では利用できません。
  • 作る: WebAPIオブジェクトを作成します。
    • (例)waという名前でWebAPIオブジェクトを生成します。
 wa=WebAPI!作る。
  • 読む: Webクライアントオブジェクトを作成します。
    • オブジェクトのプロパティでURLとパラメータを設定します。urlの設定は必須です。
    • 取得データはJSON形式に対応しています。取得したデータをプロパティと配列の構造に変換したオブジェクトを返します。
    • (例)wという名前でWebクライアントオブジェクトを生成します。
 wa=webapi!作る。
 wa:url="https://zip-cloud.appspot.com/api/search"。
 wa:zipcode="0790177"。
 ret=wa!読む。
 フィールド!(ret:results_1:address3)作る。

https://dolittle.eplang.jp/doku.php?id=ch_arduino 

で勉強 linux/raspberry piはうまくいかん なんでやろ? (xcratchも同様。。。)

以下で通信する(firmata的)

void setup(){
  Serial.begin(9600);
  Serial.write(' ');
}
void loop(){
  int wait=5;
  if (Serial.available() > 0) {
    byte in = Serial.read();
    byte cmd = in & 0xe0;
    byte port = in & 0x1f;

    switch (cmd) {
    case 0x40: // pinMode(Dout)
      pinMode(port ,OUTPUT);
      delay(wait);
      break;
    case 0x60: // pinMode(Din)
      pinMode(port ,INPUT);
      delay(wait);
      break;
    case 0x80: // Dout
      delay(wait);
      if (Serial.read() == 1) { digitalWrite(port, HIGH); } else { digitalWrite(port, LOW); }
      break;
    case 0xA0: // Din
      Serial.write(digitalRead(port));
      break;
    case 0xC0: // Aout
      delay(wait);
      analogWrite(port, Serial.read());
      break;
    case 0xE0: // Ain
      Serial.write(analogRead(port)/4);
      break;

    default :
      break;
    }
  }
}

2025年12月8日月曜日

pickit5 pedia / raspberry pi pico again

 ミニpcになってからUSB挿し口を変えて成功することが多くなった。。。。

https://tool-lab.com/pic-basic-23/ ここに電源関係がくわしい sdc,lancableはペンディング

なお書き込みスピードが速すぎとエラーがでたので以下を参考にスピードをLOWにした

書き込み失敗は多くLVP onで起こるようで、mplab snapをつかわんのでLVP offとした

https://www.watchittrend.com/mplab-icd4-write-speed-error/

以下はgetchのコンフリクトが起こったので、char eusart_getch(void)として

(eusart.c内で)衝突回避できた、c90でuart redirectでprintfがつかえた 便利

#include "mcc_generated_files/mcc.h"

#include <stdio.h>

#include <stdlib.h>

int16_t Xaxis,Yaxis,Zaxis;

char Line1[] = "  X     Y     Z ";

char Line2[] = "-xxx  -xxx  -xxx";


void itostring(char digit, uint16_t data, char *buffer){

    char i;

    buffer += digit;

    for(i=digit; i>0; i--){

        buffer--;

        *buffer = (data % 10) + '0';

        data = data / 10;

    }   

};

void numtostr(int16_t number, char *buf){

    char* ptr;

    ptr = buf; 

    if(number >= 0)

        *buf = '+';

    else {

        number *= -1;

        *buf = '-';

    }

    itostring(3, (uint16_t)number, ptr+1);

};

void main(void){

    SYSTEM_Initialize();

    while(1){

        Xaxis = (int16_t)ADC_GetConversion(ANX) - 511;

        Yaxis = (int16_t)ADC_GetConversion(ANY) - 511;

        Zaxis = (int16_t)ADC_GetConversion(ANZ) - 511;

        

        numtostr(Xaxis,Line2);

        numtostr(Yaxis,Line2+6); 

        numtostr(Zaxis,Line2+12);

        printf(" X Y Z is %s\n", Line1);

        printf("%s\n", Line2);

        __delay_ms(1000);

    }

}


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

aqm0802が3.3v駆動にて以下を実行(温度はダミー、ビルトインledは便利)

# LM61CIZ

import machine

import utime

# AQM0802

from machine import Pin, I2C

from micropython import const


from utime import sleep



# LM61 Vout connected to 34pin(ACD2)

# input LM61CIZ , convert voltage to temp value

sensor_temp = machine.ADC(2)

conversion_factor = 3.3 / (65535)


# AQM function

_ST7032  = const(0x3e)

_SETTING = const(0x00)

_DISPLAY = const(0x40)


# AQM initialized

def init(i2c):

    orders = [b'\x38', b'\x39', b'\x14', b'\x73', b'\x56', b'\x6c',

              b'\x38', b'\x0c', b'\x01']

    sleep(0.04)

    for order in orders[:6]:

        i2c.writeto_mem(_ST7032, _SETTING, order)

        sleep(0.001)

    sleep(0.2)

    for order in orders[6:]:

        i2c.writeto_mem(_ST7032, _SETTING, order)

        sleep(0.001)

    sleep(0.001)

    

# AQM show setting

def show(i2c, string):

    i2c.writeto_mem(_ST7032, _SETTING, b'\x01')

    sleep(0.002)

    for i in string:

        i2c.writeto_mem(_ST7032, _DISPLAY, i.encode())

# AQM show setting    

def main():

    i2c = I2C(1, scl=Pin(27), sda=Pin(26))

    init(i2c)

    #display temp data

    show(i2c, tempdata)


while True:

    #センサーから値を取り出します

    #reading = sensor_temp.read_u16() * conversion_factor

    #センサから取り出した電圧

    #print(sensor_temp.read_u16())

    # 電圧を温度に変換

    #temp_calc = (reading*1000-600) / 10

    temp_calc = 23.0

    #shellに表示

    #print("{0:.1f}".format(temp_calc)  + "C")

    #print(reading)

    #tempdata = str(temp_calc)

    #小数点以下1位のみ表示+ 温度のCをつける

    tempdata = ("{0:.1f}".format(temp_calc)  + "C")


    #Run

    #if __name__ == '__main__':

    main()

    # 動作確認用のLチカ

    led = machine.Pin(25, machine.Pin.OUT)

    led.value(1)

    utime.sleep(0.2)

    led.value(0)

  

    #each 2 second

    utime.sleep(2)