yoshiyuki's blog

Arduino/Teensy/Raspberry pi pico を利用した I2C, SPI 通信アプリを紹介します

Raspberry Pi Pico Sample code / USB-Serial 通信で指定した回数だけ Lチカする

Raspberry pi pico の C++ のサンプルコードです。

  • Raspberry pi pico は USB-serial 通信で1 byte 以上のデータを受信すると (受信データの数 + 1 byte) のデータを返信します
  • Raspberry pi pico は受信データの最初の 1 byte の値の回数だけ LED を点滅させます
  • Raspberry pi pico の返信データの 1 byte目は受信したデータ数 (byte数)、2 byte目以降は受信データをそのまま返信します

USB-Serial 通信アプリの動作確認用に作成しました。

プロジェクトフォルダ: pico_test

pico_test
 |-- pico_sdk.import.cmake
 |-- CMakeLists.txt
 |-- module_serial
 |    |-- module_serial.h
 |    |-- module_serial.c
 |     -- CMakeLists.txt
  -- test_01
      |-- test_01.c
       -- CMakeLists.txt

pico_test\CMakeLists.txt

cmake_minimum_required(VERSION 3.12)

# Pull in SDK (must be before project)
include(pico_sdk_import.cmake)

project(pico_ctrl C CXX ASM)
set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)

set(PICO_EXAMPLES_PATH ${PROJECT_SOURCE_DIR})

# Initialize the SDK
pico_sdk_init()

include(example_auto_set_url.cmake)

# Add subdirectory
add_subdirectory(test_01)
add_subdirectory(module_serial)

pico_test\module_serial\module_serial.h

#ifndef MODULE_SERIAL_H
#define MODULE_SERIAL_H

uint32_t serial_available();

uint32_t serial_read(uint8_t *read_data, int read_data_length);

uint32_t serial_write(uint8_t *write_data, int write_data_length);

uint32_t serial_write_1byte(uint8_t write_data);

#endif

pico_test_module_serial\module_serial.c

#include <stdio.h>
#include "pico/stdlib.h"
#include "class/cdc/cdc_device.h"
#include "./module_serial.h"

uint32_t serial_available(){
    return tud_cdc_available();
}

uint32_t serial_read(uint8_t *read_data, int read_data_length){
    return tud_cdc_read(read_data, read_data_length);
}

uint32_t serial_write(uint8_t *write_data, int write_data_length){
    uint32_t uintTMP;
    uintTMP = tud_cdc_write(write_data, write_data_length);
    tud_cdc_write_flush();
    return uintTMP;
}

uint32_t serial_write_1byte(uint8_t write_data){
    int i = 0;
    uint8_t write_data_buffer[1];
    write_data_buffer[0] = write_data;
    while(tud_cdc_write_available() < 1){
        sleep_ms(1);
        i++;

        if(i > 1000){
            tud_cdc_write_clear();
        }
    }
    uint32_t uintTMP = tud_cdc_write(write_data_buffer, 1);
    tud_cdc_write_flush();
    return uintTMP;
}

pico_test\module_serial\CMakeLists.txt

add_library(module_serial
        module_serial.c
        )

# Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(module_serial pico_stdlib)

# enable usb output, disable uart output
pico_enable_stdio_usb(module_serial 1)
pico_enable_stdio_uart(module_serial 0)

pico_test\test_01\test_01.c

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

#include "../module_serial/module_serial.h"

int main() {
    int i;
    int cntDAT;
    uint8_t getDAT[1];
    uint8_t inDAT[256];
    uint8_t outDAT[256];

    stdio_init_all();   // Setup for Serial port

    const uint LED_PIN = PICO_DEFAULT_LED_PIN;
    gpio_init(LED_PIN);
    gpio_set_dir(LED_PIN, GPIO_OUT);

    while (true) {
        cntDAT = 0;

        while(serial_available() > 0){
            serial_read(getDAT, 1);
            inDAT[cntDAT] = getDAT[0];
            cntDAT++;
            sleep_ms(10);
        }

        if(cntDAT > 0){
            outDAT[0] = 0xFF & cntDAT;
            serial_write(outDAT, 1);
            serial_write(inDAT, cntDAT);

            for(i=0; i<inDAT[0]; i++){
                gpio_put(LED_PIN, 1);
                sleep_ms(500);
                gpio_put(LED_PIN, 0);
                sleep_ms(500);
            }
        }
        
        sleep_ms(100);
    }
}

pico_test\test_01\CMakeLists.txt

add_executable(test_01
        test_01.c
        )

# Pull in our pico_stdlib which pulls in commonly used features
target_link_libraries(test_01 pico_stdlib module_serial)

# enable usb output, disable uart output
pico_enable_stdio_usb(test_01 1)
pico_enable_stdio_uart(test_01 0)

# create map/bin/hex file etc.
pico_add_extra_outputs(test_01)

# add url via pico_set_program_url
example_auto_set_url(test_01)