2022年10月25日火曜日

RaspPi① adt7410,builtin-flask,mcp3208,mcp3002,legacy-cam,aqm0802,lcd1602

ーーーーーーーーーadt7410 i2c tempーーーー

scl:serial clock, sda:serial datasd

https:cdls ls

ls

//kats-eye.net/info/2018/11/07/adt7410/

https://note.cman.jp/convert/2hosu/

ーーーーーーbuiltin flaskーーーーーーーーーーーーーーーーーーーー

https://irohaplat.com/raspberry-pi-local-web-server-flask/

なんとpython3にflaskがビルトインされていた! ラズパイすげー

ーーーーー bbks 本文の直書きコードと違いspidevを用いた付属コードーーーー

mcp3208:: 【ラズパイ】A/Dコンバータ MCP3208と通信するコードの解説 │ be発明家エンジニア (s-toki.net) 初期化の部分が丁寧に書かれている

mcp3208 は16:vcc,15:vcc,14:gnd,13;sck,12:miso,11:mosi,10:ce0,09:gnd

0〜7は各チャンネル(8チャンネルADC)

https://craft-gogo.com/raspberrypi-adconverter/#toc5 が非常に参考になった!

# -*- coding: utf-8 -*-

import RPi.GPIO as GPIO

from time import sleep

import spidev

# MCP3208からSPI通信で12ビットのデジタル値を取得。0から7の8チャンネル使用可

def readadc_spidev(adcnum):

    if ((adcnum > 7) or (adcnum < 0)):

        return -1

    command1 = 0x6 | (adcnum & 0x4)>>2

    command2 = (adcnum & 0x3)<<6

    ret=spi.xfer2([command1,command2,0])

    adcout = (ret[1]&0xf)<<8 | ret[2]

    return adcout


GPIO.setmode(GPIO.BCM)

spi=spidev.SpiDev()

spi.open(0, 0) # bus0, CE0

spi.max_speed_hz = 1000000 # 1MHz


try:

    while True:

        inputVal0 = readadc_spidev(0)

        print(inputVal0)

        sleep(0.2)


except KeyboardInterrupt:

    pass


spi.close()

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

#クジラ本のコード、mcp3002 using

import spidev

import time

# SPI通信を行うための準備 --- (*1)

spi = spidev.SpiDev()

spi.open(0, 0) # bus0,cs 0(ce1をえらぶなら1)

spi.max_speed_hz = 1000000 # 通信速度の設定 1MHZ

while True:     # 連続して値を読む

    try:

        # https://denkisekkeijin.com/raspberrypi/pi-spi-volume-rd/

        resp = spi.xfer2([0x68, 0x00]) # SPIに命令して回答をえる

# https://www.denshi.club/pc/raspi/5raspberry-pi-zeroiot9a-d6mcp3002.html

# 0、スタート1、シングル1、ODDはチャンネル0だから0、最後はMSBからで1

#     0b0110 1000 => 0x68  これで2バイトおくり、2バイトかえしてもらう

# 読んだ値を10ビットの数値に変換  このばあいMSBからである

# NullBit、10ビット、が入っているが。。。。

        value = ((resp[0] << 8) + resp[1]) & 0x3FF # 0x3 -> 0b0011 は?

# data = ((adc[0] & 3) << 8) | adc[1] と一緒 みたい。。。。

# つまり第一バイトの下位2桁をとり、第二バイトは全部取る。。。。多分!

        print(value)

        time.sleep(0.2)

    except KeyboardInterrupt:

        break


# 通信を終了する --- (*4)

spi.close()

--------------------legacy-cam------------------------------------------------------------

camera module の設定がlegacyになっていたが

https://www.boardgamepark.com/entry/pi_cameraを参考にした

カメラモジュールがOnになっているかカメラが認識されているかも説明あり

https://kats-eye.net/info/2018/11/07/adt7410/ によればregister 0x00,0x01にて

データ変換した結果をもち13ビットデータを含む16ビット(1ワード)を発出

するようである 00には下位ビット(ただし最後の3ビットは余分の0)、

01には上位ビットがはいっている 

https://note.cman.jp/convert/2hosu/ に2のほしゅう

ーーーーーーーーーーaqm0802ーーーーーーーーーーーーーーーーーーー

【ST7032i】使うためのデータシート抜粋日本語訳 | くろべこblog (kurobekoblog.com)

を参考に、Cでライブラリをおこしてみたいとおもったら以下のサイトをみつけた

I2C接続AQMシリーズのキャラクタ表示LCDをラズパイで使う (1) AQM0802 | 電子工作の環境向上 (denshi.club) 残念ながらパイソンで書かれている

このサイトにはaqm1602,acm1602,so1602の説明もあるがaqm1602以外は高価!

aqm1602はCでラズパイ本に詳しい

------------------------lcd 1602----------------------

https://hotsmmrblog.com/display_string_on_1602_lcd_module_with_pi/ 

lcd1602 using  site at raspi

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


2022年10月16日日曜日

ラズピコをシリアル機器としてラズパイで使用する(クジラ一応うごくが、改訂した)

 pip3 install pyserial のあと dmesg | grep -i ttyACMでdevice(ttyACM0 etc)を得る

import machine,time

adc0  = machine.ADC(0)

f  = 100 / 65535

while Tru:

      v  =  adc0.read_u16()  *  f

      pirnt(v)

      time.sleep(2) # kujira は time.sleep(0.5)  だが 多めの休止時間をとっとく

以上をadc-send.pyとしてthonnyでrun、以nanをadc-receive.pyとして

python3 でrunすると、一応うごくが  ときどき止まってしまうので

timeoutをとってしまったら、止まらなくなった

https://misoji-engineer.com/archives/raspberry-pi-pico-serial.html を参考にした

import serial
# kujira code -> ser = serial.Serial('/dev/ttyACM0', 115200, timeout = 1)
ser = serial.Serial('/dev/ttyACM0', 115200)

try:
while True:
data = ser.readline() # read from pico
s = data.decode()
pinrt("read:", s.strip())
except:
ser.close()

2022年10月14日金曜日

AVR総論とタイマ, attiny13a/85/44a and atmega328p

総論はこれ! 

 https://dbpro.xyz/avrwiki/wiki.cgi?page=Getting+Started+Notes+-+Ports#p8

http://usicolog.nomaki.jp/engineering/avr/avrPWM.html はタイマ総論

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

ATtiny13。ちっちゃいマイコンの書き込み方~Lチカまで@Arduino | くろべこblog (kurobekoblog.com)  attiny13aはattiny85と環境設定jsonはちがう 以下の通り

https://mcudude.github.io/MicroCore/MicroCore_MCUdude_MicroCore_index.json

Lチカは以下のとおり

#include <avr/io.h>

#include <util/delay.h> // for _delay....

void setup() {

  DDRB |= 0b00001000; // PB3 set to output 

}

void loop() {

 PORTB |= 0b00001000; //PB3 output to high

 _delay_ms(1000);

 PINB |= 0b00001000;  // 注 総論参照

_delay_ms(1000);

}


--------------------------------- atmega328p ---------------------- 
https://qiita.com/oh_one/items/ac016c58190f77f66a13
https://omoroya.com/arduino-extra-edition-22/

Arduinoで、小っちゃいIC(ATTiny)を使う方法 - Qiita 

attiny13,attiny85とポートレジスタが違うので注意 

吉野さんから以下のコードをいただいた

コードはUNOとATtiny13aを一緒にしています。
ATtiny13aはポートがBのみで、D0からD4までです。
D1、D2(6番、7番ピン)を使っています。
コンデンサと抵抗は特になくてもOKです。
 
UNOはD12にスイッチ、D11にLEDをそれぞれつないでください。
ポートはB、C、Dがありますが、B(D8からD13)を使っています。

// push switch to LED on
// avr@UNO
//  D11----R----LED----GND
//  D12----swich----GND
//  

int main(void) {
  DDRB = 0b00001000;  // D11->OUTPUT 最下位から数える 8,9,10,11,....
  PORTB = 0b00010000; // D12->INPUT_PULLUP
  while (1) {
    bool state;
    state = (~PINB >> 4) & 1;
    if (state == 0) {
      PORTB &= ~0b00001000;
    }
    else {
      PORTB |= 0b00001000;
    }
  }
}

 /*

 *  8bits Timer Counter  ATtiny13A 
 */

#include <avr/io.h>

uint8_t hsPWM(bool pin, int8_t pwm){
  // 内臓クロック9.6MHz

  if(pin==0){
    DDRB   |= 0b00000001;       // PB0出力設定
    TCCR0A |= 0b10000011;       // PB0非反転出力,高速PWM
    TCCR0B |= 0b00000010;       // 8bit高速PWM,8分周比
    OCR0A = pwm;                // 8bitタイマ/カウンタ比較レジスタA
    return OCR0A;
  }
  else{
    DDRB   |= 0b00000010;       // PB1出力設定
    TCCR0A |= 0b00100011;       // PB1非反転出力,高速PWM
    TCCR0B |= 0b00000011;       // 8bit高速PWM,64分周比
    OCR0B = pwm;                // 8bitタイマ/カウンタ比較レジスタB
    return OCR0B;
  }
}

void setup() {
}

void loop() { 
    hsPWM(1, 50);              // ピン番号、デューティ比(ex.50/255)
}


デューティ比を変えるには関数のpwmの値(1~255)を変えてください。
分周比を変えると周波数が変わります。
ちなみにTCCR0Bレジスタの下位3ビットが、010:8分周 011:64分周 100:256分周
101:024分周です。

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

attiny85::flash 8kもある! attiny44a::14pin!

------328p------------------------------------------------------------------

https://qiita.com/oh_one/items/ac016c58190f77f66a13  about atmega328p

2022年10月8日土曜日

こいのぼり全曲、5v-3v機器間でuart成功、attiny13a で鯉のぼりを演奏

define PIN 4 // 3700バイトを消化するので、attiny85 8k,attiny44a 4kであり後者はギリ
// attiny85なら、もう一曲くらいおけそう

void setup(){
  tone(PIN, 330, 300);
  delay(300);
  tone(PIN, 294, 300);
  delay(300);
  tone(PIN, 262, 600);
  delay(600);
  tone(PIN, 294, 600);
  delay(600);
  tone(PIN, 330, 600);
  delay(600);
  tone(PIN, 440, 600);
  delay(600);
  tone(PIN, 392, 300);
  delay(600);
  tone(PIN, 330, 300);
  delay(300);
  tone(PIN, 330, 300);
  delay(300);
  tone(PIN, 330, 600);
  delay(600);
  tone(PIN, 294, 300);
  delay(300);
  tone(PIN, 262, 300);
  delay(300);
  tone(PIN, 294, 600);
  delay(1800); // ミレドレ ミラソ ミミミレド レ
 
  tone(PIN, 262, 300);
  delay(300);
  tone(PIN, 294, 300);
  delay(300);
  tone(PIN, 330, 600);
  delay(600);
  tone(PIN, 392, 600);
  delay(600);
  tone(PIN,440, 300);
  delay(300);
  tone(PIN, 440, 300);
  delay(300);
  tone(PIN, 392, 600);
  delay(600);
  tone(PIN, 330, 600);
  delay(600);
  tone(PIN,392, 300);
  delay(300);
  tone(PIN, 392, 300);
  delay(300);
  tone(PIN, 330, 600);
  delay(600);
  tone(PIN, 294, 600);
  delay(600);
  tone(PIN, 262, 600);
  delay(1800); // ドレミソ ララソミ ソソミレ ド

  tone(PIN,523,300);
  delay(300);
  tone(PIN,523,300);
  delay(300);
  tone(PIN,523,600);
  delay(600);
  tone(PIN,440,600);
  delay(600);
  tone(PIN,392,300);
  delay(300);
  tone(PIN,392,300);
  delay(300);
  tone(PIN,392,600);
  delay(600);
  tone(PIN,330,600);
  delay(600);
  tone(PIN,294,300);
  tone(PIN,294,300);
  delay(300);

  delay(300);  tone(PIN,294,600);
delay(1800);
//ドドドラ ソソソミ レレレドミ ソ

  delay(600);
  tone(PIN,262,600);
  delay(600);
  tone(PIN,330,600);
  delay(600);
  tone(392,600);
  tone(PIN,262,300);
  delay(300);
  tone(PIN,294,300);
  delay(300);
  tone(PIN,330,600);
  delay(600);
  tone(PIN,392,600);
  delay(600);
  tone(PIN,523,600);
  delay(600);
  tone(PIN,440,600);
  delay(600);
  tone(PIN,392,600);
  delay(600);
  tone(PIN,330,300);
  delay(300);
  tone(PIN,330,300);
  delay(300);
  tone(PIN,293,600);
  delay(300);
  tone(PIN,330,600);
  delay(300);
  tone(PIN,262,600);
delay(600); // ソレミソ ドラソ ミミレミ ド 
}

102による電圧レベル変換 [Arduino] (petitmonte.com)はI2Cに接続していたが

UARTにも利用できるのではと以下のコードをやって成功 FXMAの3V供給はラズピコ

より

void loop(){}

音階周波数(Hz)

ド130.815レ146.835ミ164.82ファ174.62ソ196.00ラ220.00シ246.94

ド261.63レ293.67ミ329.63ファ349.23ソ392.00ラ440.00シ493.88 標準

ド523.23レ587.34ミ659.25ファ698.45ソ783.98ラ879.99シ987.75

ド1046.5レ1174.7ミ1318.6ファ1397.1ソ1567.96ラ1759.98シ1975.5

ド2093.0レ2349.4ミ2637.2ファ2794.2ソ3135.92ラ3519.96シ3951.0ド4186.0

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

FXMA2でシリアルしてみて成功、5VとGND供給はアルディーノからおこなった 

またアルディーノとラズピコの間のGNDも共通化した

pico :: 

from machine import UART,Pin

import time

u=UART(1,9600,tx=Pin(4),rx=Pin(5))

while True:

   ret = u.readline();

   if ret is not None:

      prin(ret)

   time.sleep(1)

arduino::

    void setup() {

       Serial.begin(9600);

    }

    void loop() {

       Serial.write("from Arduino\n");

       delay(20000);

   }


^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

https://mag.switch-science.com/2015/04/29/gwprojact_koinobori/

 arduino as ispのとき、resetピンに10kの抵抗は不要だった!(attiny85 also)

下記のコードでresetピンか10k抵抗を介してタクトスイッチに接続してgndピンに

接続すると何回でもリセットかけれる

#define PIN 4

void setup(){
    tone(PIN, 330, 300);
  delay(300);
  tone(PIN, 294, 300);
  delay(300);
  tone(PIN, 262, 600);
  delay(600);
  tone(PIN, 294, 600);
  delay(600);
  tone(PIN, 330, 600);
  delay(600);
  tone(PIN, 440, 600);
  delay(600);
  tone(PIN, 392, 300);
  delay(600);
  tone(PIN, 330, 300);
  delay(300);
  tone(PIN, 330, 300);
  delay(300);
tone(PIN, 330, 600); delay(600); tone(PIN, 294, 300); delay(300); tone(PIN, 262, 300); delay(300); tone(PIN, 294, 600); } void loop(){ } //ミレドレミラソ ミミミレドレ