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 ;
    }
}


Raspberry Pi Pico プログラミング事始め。タイマー割り込み

今日はタイマー割り込みをしてみた。

結構APIがしっかりしていて、下記のようにPWMのプログラムをタイマー割り込みVerに変更してみた。

参考は下記サイト

https://qiita.com/keyyum/items/3ce448c098c546dced20

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

const uint LED_PIN = 22;  
uint slice_num;
int i=0;
int flag=0;

bool timer_callback( repeating_timer_t *rt )
{

    pwm_set_enabled(slice_num, false);

    if(flag==0){
        i=i+1;
        if(i==256) flag=1;
        else ;    
    }    
    else {
        i=i-1;
        if(i==0) flag=0;
        else ;
    }
    pwm_set_chan_level(slice_num, 0, i);
    pwm_set_enabled(slice_num, true);
    return ( true );

}

void init(void)
{
 
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    gpio_set_function(LED_PIN, GPIO_FUNC_PWM);
    slice_num = pwm_gpio_to_slice_num(22); //pin 22 slice No = 22
    /*例えばPWM周波数を1KHzに、PWMの分解能を8ビット(0~255)に設定したい場合、
    sysclock = 125,000,000Hz、wrap = 255、f=1000Hz より
    clkdiv = sysclock / ((wrap+1) ⋅ f )
    分周比 clkdiv = 488.2812 となる。*/
    pwm_set_clkdiv(slice_num, 488.2812);
    pwm_set_wrap(slice_num, 255);

    // チャンネルPWMのHigh期間を設定
    pwm_set_chan_level(slice_num, 0, 0);
    pwm_set_enabled(slice_num, true);

}


int main() {

    init();
   static repeating_timer_t timer;
   
    add_repeating_timer_ms( -10, &timer_callback, NULL, &timer );


    while (true) {
       
    }

    }

2022年5月4日水曜日

Raspberry Pi Pico プログラミング事始め。PWM編

 続いてPWMを動かしてみます。

LEDをGPIO 22に付けました。

ので 22ピンのPWMを動かしてみます。

ソースコードは下記のように周期的にPWM周期を変えてみました。

ハマった点は3か所

1)#include "hardware/pwm.h" をインクルードする。。。

2)uint slice_num = pwm_gpio_to_slice_num(22);  ここはGPIO番号を入れれば良いらしい。

3)一番最初にBuildできなかったのが、CMakeLists.txtに記載が必要だった。

  # Pull in our pico_stdlib which pulls in commonly used features        

   target_link_libraries(pwm pico_stdlib hardware_pwm)

  これだから人気でないんだよな~


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

int main() {
#ifndef PICO_DEFAULT_LED_PIN
#warning blink example requires a board with a regular LED
#else
    const uint LED_PIN = 22;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    gpio_set_function(LED_PIN, GPIO_FUNC_PWM);
    uint slice_num = pwm_gpio_to_slice_num(22); //pin 22 slice No = 22
    /*例えばPWM周波数を1KHzに、PWMの分解能を8ビット(0~255)に設定したい場合、
    sysclock = 125,000,000Hz、wrap = 255、f=1000Hz より
    clkdiv = sysclock / ((wrap+1) ⋅ f )
    分周比 clkdiv = 488.2812 となる。*/
    pwm_set_clkdiv(slice_num, 488.2812);
    pwm_set_wrap(slice_num, 255);

    // チャンネルPWMのHigh期間を設定
    pwm_set_chan_level(slice_num, 0, 5);
    pwm_set_enabled(slice_num, true);

    int i=0;
    int flag=0;

    while (true) {

    if(flag==0){
        i=i+1;
        if(i==256) flag=1;
        else ;    
    }    
    else {
        i=i-1;
        if(i==0) flag=0;
        else ;
    }
    pwm_set_chan_level(slice_num, 0, i);
    pwm_set_enabled(slice_num, true);
        sleep_ms(10);
        pwm_set_enabled(slice_num, false);

       
    }
#endif
}



2022年5月3日火曜日

Raspberry Pi Pico プログラミング事始め。UART編 出力PINを変える。

 UART0は色々なPINから出力できるようだ。

今回は16,17ピンからFT232Cに出力させたい。

こんな感じでできました。

GPIOの番号で出力ピンを設定するのね。。。


/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

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

int main() {
    stdio_init_all();
    int i;
    i=0;

    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);
    uart_init(uart0, 115200);
    gpio_set_function(12, GPIO_FUNC_UART);
    gpio_set_function(13, GPIO_FUNC_UART);
    uart_set_translate_crlf(uart0, true);

    while (true) {
        //printf("%d",i);
       
        sleep_ms(1000);
        if(i==0) {
            uart_puts(uart0, "Hello world!\n");
            gpio_put(LED_PIN, 1);
            i=i+1;
        }
        else {
            i=0;
            uart_puts(uart0, "GPIO Change!\n");
            gpio_put(LED_PIN, 0);
        }
       
    }
    return 0;
}


2022年4月30日土曜日

Raspberry Pi Pico HWについて

 USBケーブルの抜き差しが面倒臭い。

リセットボタンを追加してリセットしながらBOOTボタンを押して、リセットを話してからBOOTボタンを離せば。

USBケーブルを抜き差ししないでも、書き込めれるらしい。