2022年6月14日火曜日

Raspberry Pi Pico PIOが少し理解できた。1回目

 Interface誌のPIOの解説を読んだが、まったく理解できなかった。

しょうがないので、先人たちの知恵をGoogleで探してようやく少し理解できた。

ヒントはこのサイトにあった。

https://qiita.com/keyyum/items/aa171aa295b714bb8467

先ず私が誤解していたのが

OUT命令だった。

OUT pins, 2

てっきり一つの端子から、TX FIFOに入ったデータが2ビット分で出来るのかと思っていたが、間違いで、イメージとしては2つの端子に出力するコマンドらしい。

よって下記のように書くと OSRからデータを引っ張ってきてOSRから2ビット分を2つの端子に出力するという事のようだ。

loop: pull ; TX_FIFOからOSRへデータをPULL out pins, 2 ; OSRから2bit分出力ポートへ jmp loop ; 先頭に戻る


もう一つ勘違いしていたのが、上記の命令を行った後、ようはTX FIFOからデータをpullするとデータは空になると思っていたが、FIFOのデータは空にならなく、下記プログラムのようにFIFOを書き換えるまではキープされるようだ。

pio_sm_put_blocking( pio, sm, 0x0001 ); /* ( GPIO3, GPIO2 ) = ( L, H ) */

/* TX FIFOにデータを書き込み */ sleep_us( 1 ); /* 1us待機 */ pio_sm_put_blocking( pio, sm, 0x0002 ); /* ( GPIO3, GPIO2 ) = ( H, L ) */ /* TX FIFOにデータを書き込み */


ここまで理解するのに1週間が掛かった。

2022年5月18日水曜日

raspberry pi 初期設定 2022

 焼きたてのSDカードから

先ずはSSHが使えるようにする。

Wifiの設定はモニターを繋いでから初期設定で実施。

続いて、エディター vim と パーテーション情報を見たかったので Gparted をインストール

さて、では順を追って設定

① dhcpd.configで固定IPに変更 sudo vi /etc/dhcpcd.conf

ファイルの最後に下記文言を張り付け

私の環境では、Windows マシンで環境を確認。

interface wlan0

static ip_address=192.168.1.71/24

static routers=192.168.1.1

static domain_name_servers=192.168.1.1

② /の直下にsshという空ファイルを置く。

そうすると SSHで入れるようになった。

③ 日本語化

sudo apt-get install ibus-mozc

④ リモートデスクトップ

sudo apt-get install xrdp

sudo systemctl enable xrdp   # 自動起動が不要な場合は実行しない

ラズパイコンフィグでもおまじない。

sudo raspi-config

2 Display Option > D4 Screen Blankingと選択していきます。

Would you like to enable screen blanking?

と聞かれますのでYesを選択してエンターキーを押します。設定が完了すると再起動を求められますので再起動します。

これで、一通り困らなくなるので、あとは入れたいソフトを入れ行くだけ。

2022年5月8日日曜日

raspberry pi のwifiを無効化する方法

 忘れないように。。。


良く忘れる。

Wifi無効化


sudo iwconfig wlan0 txpower off


Wifi有効化


sudo iwconfig wlan0 txpower auto

2022年5月7日土曜日

Raspberry Pi Pico プログラミング事始め。I2Cを使うぞの巻

 結構前日までは、スムーズに進んだのですがI2Cでは色々とハマりました。

AQM1602のLCDを動かそうと思って作業をしましたが、いろいろとハマりようやく表示できました。

動かしたのは秋月のこんなやつ、一番安いやつですね。

はまったポイントはいっぱい。

今日の段階では何とか動いた感じである。

波形が出ているかもわからず。。。

やっぱりオシロ欲しいな。。。

i2c_write_blocking( , , , ,true) だと動かない。。。

i2c_write_blocking(I2C_PORT, addr, buf, 2, false);


#include "pico/stdlib.h"
#include "hardware/i2c.h"

#include <stdio.h>

#define addr 0x3e
#define command 0x00
#define data1 0x40
#define clear 0x01
#define home 0x02
#define display_On 0x0f
#define LCD_2ndline 0x40+0x80
#define READ_BIT 0x80

#define I2C_PORT  i2c1

void init(void) {
   i2c_init(I2C_PORT, 100 * 1000);
    gpio_set_function(26, GPIO_FUNC_I2C);
    gpio_set_function(27, GPIO_FUNC_I2C);
    gpio_pull_up(26);
    gpio_pull_up(27);

}

static void I2C_read_registers(uint8_t reg, uint8_t *buf, uint16_t len) {
    // For this particular device, we send the device the register we want to read
    // first, then subsequently read from the device. The register is auto incrementing
    // so we don't need to keep sending the register we want, just the first.
    reg = reg | READ_BIT;
    i2c_write_blocking(I2C_PORT, addr, &reg, 1, true);
    i2c_read_blocking(I2C_PORT, addr, buf, len, true);
}

static void I2C_write_register(uint8_t reg, uint8_t data) {
    uint8_t buf[2];
    //buf[0] = reg & 0x7f;  // remove read bit as this is a write
    buf[0] = reg;
    buf[1] = data;
    i2c_write_blocking(I2C_PORT, addr, buf, 2, false);
}

int main() {
    stdio_init_all();

    init();

    const uint LED_PIN = 22;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    char *b = "apple pen" ;
    int cnt;

   while(true){
   I2C_write_register(command,0x38);
   sleep_ms(1);
   I2C_write_register(command,0x39);
   sleep_ms(1);
   I2C_write_register(command,0x14);
   sleep_ms(1);
   I2C_write_register(command,0x73);
   sleep_ms(1);
   I2C_write_register(command,0x56);
   sleep_ms(1);
   I2C_write_register(command,0x6c);
   sleep_ms(1);
   sleep_ms(1);
   I2C_write_register(command,home);
   sleep_ms(1);
   I2C_write_register(command,clear);
   sleep_ms(1);
   I2C_write_register(command,display_On);
   sleep_ms(1);
   
   for (cnt = 0; *(b + cnt) != '\0'; cnt++) {
       I2C_write_register(data1, *( b + cnt));
       }
   sleep_ms(1000);
   }

}









2022年5月5日木曜日

Raspberry Pi Pico プログラミング事始め。SWでのHW割り込み

 続いてSWでのHW割り込みをかけてみた。

特にハマるところはなし。

callback関数が呼び出されたら、割り込みを一度OFFして関数を抜けるときに再度割り込みをONにする。


#include "pico/stdlib.h"
#include <stdio.h>

const uint input_PIN = 20;

void callback_keyirq() {
    gpio_set_irq_enabled(input_PIN, 0x4u, false);
    printf("push_sw\n");
    gpio_set_irq_enabled(input_PIN, 0x4u, true);

}

int main() {
    stdio_init_all();

 
    gpio_init(input_PIN);
    gpio_set_dir(input_PIN, GPIO_IN);
    const uint LED_PIN = 22;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
   
    gpio_set_irq_enabled_with_callback(input_PIN, 0x4u, false, callback_keyirq);
    gpio_set_irq_enabled(input_PIN, 0x4u, true);

    while (true) {
        gpio_put(LED_PIN, 1);
        sleep_ms(200);
        gpio_put(LED_PIN, 0);
        sleep_ms(200);
     }
   
}


Raspberry Pi Pico プログラミング事始め。GPIO 入力。

キー入力の割り込みを身に着けようと思ったら、まだ通常の割り込み入力も行っていなかった。

慌てて、下記プログラムを記載。

はまった点

・Serial標準出力を使うときには、stdio_init_all();を入れないとダメだった。

 全然GPIO入力と関係ない所ではまりました。

 その他はすなおに作れました。。。

ボタンを押した回数のカウントです。


#include "pico/stdlib.h"
#include <stdio.h>

int main() {
    stdio_init_all();
    int i=0;
    const uint input_PIN = 20;
    gpio_init(input_PIN);
    gpio_set_dir(input_PIN, GPIO_IN);
    while (true) {
     if(gpio_get(input_PIN) == 0)
     {
         i++;
         sleep_ms(500);
         printf("%d",i);
         printf("kaime\n");
     }
     else ;
    }
}