Raspberry pi pico
programación C
Semáforo
programación C
Semáforo
Anteriormente se realizó estos dos
montaje programando en python y IDE arduino, ahora lo realizo en
C.
En estos dos primeros montajes realizaré un parpadeo de un LED y
en el segundo un semáforo.
Para programar en C debemos instalar una SDK.
https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf
He realizado un pequeño tutorial en vídeo de como instalar el
SDK sobre Linux - Debian11.
Estos son los pasos para instalar y compilar con la SDK
Fuente capítulo 2 de
"Getting started with Raspberry Pi Pico" ROOT ==== sudo apt update sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential USUARIO ======= cd ~/ mkdir pico cd pico git clone -b master https://github.com/raspberrypi/pico-sdk.git cd pico-sdk git submodule update --init cd .. git clone -b master https://github.com/raspberrypi/pico-examples.git ----Update---- cd pico-sdk git pull git submodule update ----Compilar ejemplos --- cd pico-examples mkdir build cd build export PICO_SDK_PATH=../../pico-sdk cmake .. cd blink make -j4 ---Encende la Raspberry pi pico mientras está pulsado botón BOOT-- cp blink.uf2 /media/USUARIO/RPI-RP2/ |
Para que no tenga que desconectar y conectar el usb cada vez que cargo un programa la raspberry pi pico, he colocado un pulsador en el pin 3v3_ENABLE.
Ahora cada vez que tengo que probar un programa, solo tengo que pulsar a la vez los botones BOOT y 3v3_ENABLE, y soltar 3v3_ENABLE y BOOT, por este orden.
Inmediatamente se pondrá en el modo de carga de programa.
En la propia placa de Raspberry se incluye un LED en el pin GP25, aunque externamente no se puede acceder al pin GP25.
He utilizado el programa de Blink que viene en ejemplos.
/* * Copyright (c) 2020 Raspberry Pi (Trading) Ltd. * * SPDX-License-Identifier: BSD-3-Clause */ #include "pico/stdlib.h" int main() { #ifndef PICO_DEFAULT_LED_PIN #warning blink example requires a board with a regular LED #else const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); while (true) { gpio_put(LED_PIN, 1); sleep_ms(100); gpio_put(LED_PIN, 0); sleep_ms(400); } #endif } |
add_executable(blink blink.c ) # pull in common dependencies target_link_libraries(blink pico_stdlib) # create map/bin/hex file etc. pico_add_extra_outputs(blink) # add url via pico_set_program_url example_auto_set_url(blink) |
En el segundo montaje realizo un simple semáforo.
Se utilizan 5 pin de la Raspberry, 3 son para las luces de los coches, y 2 para las luces de los peatones.
Entorno para compilar Semaforo
#!/bin/sh export PICO_SDK_PATH=~/pico/pico-sdk echo ======ENTORNO============ echo ENTORNO echo $PICO_SDK_PATH echo ======COMPILAR=========== echo 'mkdir build && cd build' echo cmake .. echo make echo 'make -j$(nproc)' echo 'cp programaPI.uf2 /media/usuario/RPI-RP2/' echo |
#include <stdio.h> #include <pico/stdlib.h> /* # SEMÁFORO PARA RASPBERRY PI PICO en C # SETA43 # seta43.duckdns.org # seta43.blogspot.com # Palencia / España # 25-08-2022 */ #define sROJO 18 #define sAMARILLO 19 #define sVERDE 20 #define pVERDE 17 #define pROJO 16 int tPARPADEO=400; int tSEMAFORO=10000; int tAMARILLO=3000; long tPEATON=6000; int main() { stdio_init_all(); const uint LED_PIN = PICO_DEFAULT_LED_PIN; gpio_init(LED_PIN); gpio_set_dir(LED_PIN, GPIO_OUT); gpio_init(sROJO); gpio_set_dir(sROJO, GPIO_OUT); gpio_init(sAMARILLO); gpio_set_dir(sAMARILLO, GPIO_OUT); gpio_init(sVERDE); gpio_set_dir(sVERDE, GPIO_OUT); gpio_init(pROJO); gpio_set_dir(pROJO, GPIO_OUT); gpio_init(pVERDE); gpio_set_dir(pVERDE, GPIO_OUT); printf("Hello world %d\n",LED_PIN); while (true) { gpio_put(sAMARILLO, 0); gpio_put(sROJO, 1); gpio_put(pROJO, 0); gpio_put(pVERDE, 1); sleep_ms(tPEATON); for(int z=0;z<=7;++z) { gpio_put(pVERDE, 0); sleep_ms(tPARPADEO); gpio_put(pVERDE, 1); sleep_ms(tPARPADEO); } gpio_put(pROJO, 1); sleep_ms(1000); gpio_put(sVERDE, 1); gpio_put(sROJO, 0); sleep_ms(tSEMAFORO); gpio_put(sAMARILLO, 1); gpio_put(sVERDE, 0); sleep_ms(tAMARILLO); } } |
cmake_minimum_required(VERSION
3.13) include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake) project(programaPI C CXX ASM) set(CMAKE_C_STANDARD 11) set(CMAKE_CXX_STANDARD 17) pico_sdk_init() add_executable(${PROJECT_NAME} main.c) pico_add_extra_outputs(${PROJECT_NAME}) target_link_libraries(${PROJECT_NAME} pico_stdlib) pico_enable_stdio_usb(${PROJECT_NAME} 1) pico_enable_stdio_uart(${PROJECT_NAME} 0) |
He realizado el mismo programa pero creando funciones tipo arduino.
/* # SEMÁFORO PARA RASPBERRY PI PICO en C # SETA43 # seta43.duckdns.org # seta43.blogspot.com # Palencia / España # 25-08-2022 */ #include <stdio.h> #include <pico/stdlib.h> #define sROJO 18 #define sAMARILLO 19 #define sVERDE 20 #define pVERDE 17 #define pROJO 16 int tPARPADEO=400; int tSEMAFORO=10000; int tAMARILLO=3000; long tPEATON=6000; #define OUTPUT 1 #define INPUT 0 #define HIGH 1 #define LOW 0 void pinMode(unsigned int port, char modo) { gpio_init(port); if(modo==OUTPUT) gpio_set_dir(port, GPIO_OUT); else gpio_set_dir(port, GPIO_IN); } void digitalWrite(unsigned int port, char val) { gpio_put(port, val); } void delay(long t) { sleep_ms(t); } int main() { stdio_init_all(); pinMode(sROJO, OUTPUT); pinMode(sAMARILLO, OUTPUT); pinMode(sVERDE, OUTPUT); pinMode(pVERDE, OUTPUT); pinMode(pROJO, OUTPUT); //#INICIALIZAR digitalWrite(sAMARILLO, HIGH); digitalWrite(sROJO, HIGH); digitalWrite(sVERDE, LOW); digitalWrite(pROJO, HIGH); digitalWrite(pVERDE, LOW); delay(1000); while(1) { digitalWrite(sAMARILLO, LOW); digitalWrite(sROJO, HIGH); digitalWrite(pROJO, LOW); digitalWrite(pVERDE, HIGH); delay(tPEATON); //Parpadeo verde peatón for(int z=0;z<=7;++z) { digitalWrite(pVERDE, LOW); delay(tPARPADEO); digitalWrite(pVERDE, HIGH); delay(tPARPADEO); } digitalWrite(pROJO, HIGH); delay(1000); digitalWrite(sVERDE, HIGH); digitalWrite(sROJO, LOW); delay(tSEMAFORO); digitalWrite(sAMARILLO, HIGH); digitalWrite(sVERDE, LOW); delay(tAMARILLO); } } |
Espero que este montaje os haya parecido interesante.
Saludos.
Juan Galaz
Bibliografía:
https://datasheets.raspberrypi.com/pico/raspberry-pi-pico-c-sdk.pdf
https://datasheets.raspberrypi.com/pico/getting-started-with-pico.pdf
seta_PIB
seta_PIA
https://lindevs.com/set-up-raspberry-pi-pico-sdk-on-ubuntu
https://www.electroniclinic.com/raspberry-pi-pico-rp2040-programming-in-micropython-with-examples/
https://www.youtube.com/watch?v=2gihPgEkvL8
https://picockpit.com/raspberry-pi/es/todo-sobre-la-frambuesa-pi-pico/