コンテンツにスキップ

02. 赤外線 LED を制御する

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/**
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

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

#define DATA_MAX_LENGTH 0xFF

int main()
{
    stdio_init_all();

    const uint pin_ir = 2;
    const uint pin_led = 25;
    bool value = false;

    gpio_init(pin_ir);
    gpio_init(pin_led);
    gpio_set_dir(pin_ir, GPIO_OUT);
    gpio_set_dir(pin_led, GPIO_OUT);

    unsigned char data[DATA_MAX_LENGTH] = {196, 211, 100, 128, 0, 4, 24, 80, 108, 2, 0, 0, 0, 0, 0, 0, 0, 179, 0xFF};

    while (true)
    {
        value = !value;
        gpio_put(pin_led, value);
        ir_transmit_data(pin_ir, data);
        sleep_ms(5000);
    }

    return 0;
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#pragma once

/**
 * @brief 38kHzに変調して1Tを送信する
 *
 * @param pin ピン番号
 */
void ir_transmit_1t(uint pin);

/**
 * @brief 1ビットの値を送信する
 *
 * @param pin ピン番号
 * @param value 値
 */
void ir_transmit_1bit(uint pin, unsigned char value);

/**
 * @brief 1バイトの値を送信する
 *
 * @param pin ピン番号
 * @param value 値
 */
void ir_transmit_1byte(uint pin, unsigned char value);

/**
 * @brief リーダーコードを送信する
 *
 * @param pin ピン番号
 */
void ir_transmit_reader_code(uint pin);

/**
 * @brief データを送信する
 *
 * @param pin ピン番号
 * @param data データ (終端は0xFFにすること)
 */
void ir_transmit_data(uint pin, unsigned char *data);
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <stdio.h>
#include "pico/stdlib.h"

#define PULSE_WIDTH 26 // 38kHzの1パルスの幅[us]
#define T_WIDTH 440    // Tの時間軸の幅[us]

void ir_transmit_1t(uint pin)
{
    // 38kHz変調の場合、1パルスは約26us
    // 1T=440usだから26usのパルスを440/26≒17回送る
    for (int i = 0; i < 17; i++)
    {
        gpio_put(pin, true);
        busy_wait_us(PULSE_WIDTH / 3);
        gpio_put(pin, false);
        busy_wait_us(PULSE_WIDTH * 2 / 3);
    }
}

void ir_transmit_1bit(uint pin, unsigned char value)
{
    if (value >= 1)
    {
        // 1のときは1T送って3Tなにもしない
        ir_transmit_1t(pin);
        busy_wait_us(T_WIDTH * 3);
        return;
    }
    // 0のときは1T送って1T何もしない
    ir_transmit_1t(pin);
    busy_wait_us(T_WIDTH);
}

void ir_transmit_1byte(uint pin, unsigned char value)
{
    // 7ビット目→0ビット目の順で取り出して送る
    for (int i = 7; i >= 0; i--)
    {
        ir_transmit_1bit(pin, (value >> i) & 1);
    }
}

void ir_transmit_reader_code(uint pin)
{
    // 8T送る
    for (int i = 0; i < 8; i++)
    {
        ir_transmit_1t(pin);
    }
    // 4T待つ
    busy_wait_us(T_WIDTH * 4);
}

void ir_transmit_data(uint pin, unsigned char *data)
{
    // データの長さを計算する
    int length;
    for (length = 0; data[length] != 0xFF; length++)
        ;

    // リーダーコードを送信する
    ir_transmit_reader_code(pin);

    // 信号を送信する
    for (int i = 0; i < length; i++)
    {
        ir_transmit_1byte(pin, data[i]);
    }

    // ストップビットを送信する
    ir_transmit_1bit(pin, 0);
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# Generated Cmake Pico project file

cmake_minimum_required(VERSION 3.13)

set(CMAKE_C_STANDARD 11)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)

# Initialise pico_sdk from installed location
# (note this can come from environment, CMake cache etc)

# == DO NEVER EDIT THE NEXT LINES for Raspberry Pi Pico VS Code Extension to work ==
if(WIN32)
    set(USERHOME $ENV{USERPROFILE})
else()
    set(USERHOME $ENV{HOME})
endif()
set(sdkVersion 2.0.0)
set(toolchainVersion 13_2_Rel1)
set(picotoolVersion 2.0.0)
set(picoVscode ${USERHOME}/.pico-sdk/cmake/pico-vscode.cmake)
if (EXISTS ${picoVscode})
    include(${picoVscode})
endif()
# ====================================================================================
set(PICO_BOARD pico CACHE STRING "Board type")

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

project(hello_usb C CXX ASM)

# Initialise the Raspberry Pi Pico SDK
pico_sdk_init()

# Add executable. Default name is the project name, version 0.1

if (TARGET tinyusb_device)
    add_executable(hello_usb
            hello_usb.c
            ir.c
            )

    # pull in common dependencies
    target_link_libraries(hello_usb pico_stdlib)

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

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

    # add url via pico_set_program_url
elseif(PICO_ON_DEVICE)
    message("Skipping hello_usb because TinyUSB submodule is not initialized in the SDK")
endif()