0
0

More than 1 year has passed since last update.

M5Stack Core2: シリアルで LED を制御

Last updated at Posted at 2022-09-24

Raspberry Pi で M5StackCore2 を制御

IMG_20220924_191713.jpg

プログラム

serial_led.ino
// ---------------------------------------------------------------
/*
	serial_led.ino

						Sep/24/2022
*/
// ---------------------------------------------------------------
#include <M5Core2.h>
#include <Adafruit_NeoPixel.h>
#define PIN 25 
#define NUMPIXELS 9 //LEDの数を指定
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);

int icount = 0;
// ---------------------------------------------------------------
void setup()
{
	Serial.println("*** setup *** start ***");

	pixels.begin(); //NeoPixelの初期化

	M5.begin();
	M5.Lcd.setTextSize(3);
}

// ---------------------------------------------------------------
void loop() {
	if ((icount % 100) == 0)
	{  
	Serial.println("*** loop *** " + String(icount));
	}

	pixels.clear(); // NeoPixelのリセット
 

	for(int jt=0; jt<200; jt++)
	{
	String aStr = serial_receive_proc();

	if (2 < aStr.length())
		{
		led_proc (aStr);
		}

	delay(100);
	icount++;
	}
}

// --------------------------------------------------------------
void led_proc (String aStr)
{
	M5.Lcd.setCursor(0, 0);
	M5.Lcd.printf("LED Sample %s     \n",aStr);
	M5.Lcd.printf("aStr.length =  %d\n",aStr.length());

	for (int it=0; it<4; it++)
		{
		int jt = it + 5;
		pixels.setPixelColor(it, pixels.Color(0, 0, 0));
		pixels.setPixelColor(jt, pixels.Color(0, 0, 0));    
		}

	if (0 <= aStr.indexOf("red"))
		{
		M5.Lcd.println("LED Red   ");
		M5.Lcd.printf("check: %s     \n",aStr);
		pixels.setPixelColor(5, pixels.Color(150, 0, 0));
		pixels.setPixelColor(6, pixels.Color(150, 0, 0));
		}
	else if (0 <= aStr.indexOf("blue"))
		{
		M5.Lcd.println("LED Blue  ");
		M5.Lcd.printf("check: %s     \n",aStr);
		pixels.setPixelColor(0, pixels.Color(0, 0, 150));
		pixels.setPixelColor(1, pixels.Color(0, 0, 150));
		}	
	else if (0 <= aStr.indexOf("green"))
		{
		M5.Lcd.println("LED Green");
		M5.Lcd.printf("check: %s     \n",aStr);
		pixels.setPixelColor(2, pixels.Color(0, 150, 0));
		pixels.setPixelColor(3, pixels.Color(0, 150, 0));
		}
	else if (0 <= aStr.indexOf("yellow"))
		{
		M5.Lcd.println("LED Yellow");
		M5.Lcd.printf("check: %s     \n",aStr);
		pixels.setPixelColor(7, pixels.Color(150, 150, 0));
		pixels.setPixelColor(8, pixels.Color(150, 150, 0));
		}

	pixels.show();	 //LEDに色を反映
}

// ---------------------------------------------------------------
String serial_receive_proc()
{
	String aStr = "";  
	if (0 <  Serial.available() )
	{
  
	// 終了文字まで取得
	aStr = Serial.readStringUntil('\n');
	Serial.print("Input:");
	Serial.println(aStr);

	M5.Lcd.setCursor(0, 150);
	M5.Lcd.println("Input:");
	M5.Lcd.setCursor(0, 200);
	M5.Lcd.print(aStr);
	M5.Lcd.println("                         ");
	}

	return aStr;
}

// ---------------------------------------------------------------

Arduino IDE

image.png

テスト用プログラム

serial_test.py
#! /usr/bin/python
#
import serial
import sys
import time

sys.stderr.write("*** start ***\n")
ser = serial.Serial('/dev/ttyUSB0', 115200, timeout=0.1)
#
while True:
	for color in [b"red",b"blue",b"green",b"yellow"]:
		ser.write(color)
		print(color)
		for it in range(30):
			string_data = ser.read_all()
			if (0 < len(string_data)):
				print(string_data)
			time.sleep(0.1)
#
ser.close()
#

cu でテスト

cu -l /dev/ttyUSB0 -s 115200
Connected.
Input:red
Input:green

Ubuntu でのソフトのインストール

sudo apt install cu

ユーザーを dialout グループに加える

sudo gpasswd -a uchida dialout

一度、ログアウトして確認

groups uchida
id

実行結果

$ groups uchida
uchida : uchida adm dialout cdrom sudo dip plugdev lpadmin lxd sambashare

$ id
uid=1000(uchida) gid=1000(uchida) groups=1000(uchida),4(adm),20(dialout),24(cdrom),27(sudo),30(dip),46(plugdev),122(lpadmin),134(lxd),135(sambashare)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0