RobotikaBrno - RBControl

Add message

platformio.ini


[env:alksesp32]
platform = espressif32
board = alksesp32
framework = arduino

upload_speed = 921600
monitor_speed = 115200
; monitor_port = COM9


main.cpp

#include <Arduino.h>
#include <Wire.h>
#include "Pixy2I2C.h"
#include "time.hpp"
#include "Pixy2Line.h"

static const uint32_t i2c_freq = 400000;

Pixy2I2C pixy;
static const uint8_t Pixy_addr = 0x54;
byte L_R_light = 0;  // cervena dioda indikuje provoz

void setup() {
    Serial.begin (115200);
    Serial.print ("Starting.../n");
   
//Wire.begin
 // inicializace Pixy2
    pixy.init(Pixy_addr);
    Serial.println (pixy.changeProg("line"));
    pinMode(L_R, OUTPUT);
}

 timeout send_data { msec(500) }; // timeout zajistuje posilani dat do PC kazdych 500 ms

void loop()
{
    if (send_data) {      // if časovač send_data dosáhne nastavené hodnoty, proveď
        send_data.ack(); // nuluje časovač send_data 
        if (L_R_light == 0) L_R_light = 1; else  L_R_light = 0;
        digitalWrite(L_R, L_R_light);  // blikani LED indikuje provoz
        pixy.line.getMainFeatures();
        if (pixy.line.numVectors) pixy.line.vectors->print();
        if (pixy.line.numIntersections) pixy.line.intersections->print();
    }
}


#include <Arduino.h>
#include "RBControl_manager.hpp"
#include <Servo.h>
#include "nvs_flash.h"
#include "BluetoothSerial.h"

class command_parser
{
public:
	enum state_t { bad, ready, simple_command, header, st_data };

	command_parser()
		: m_state(bad), m_cmd(0), m_cmd_size(0), m_size(0), m_tx_ptr(0), m_err_cnt(0)
	{
	}

	void clear()
	{
		m_state = ready;
	}

	uint8_t cmd() const { return m_cmd; }
	uint8_t size() const { return m_size; }
	uint8_t const * data() const { return m_rx_buffer; }
	uint16_t error_cnt() const { return m_err_cnt; }
	void clear_error_cnt() { m_err_cnt = 0; }

	uint8_t push_data(uint8_t ch)
	{
		switch (m_state)
		{
		case ready:
			if (ch == 0x80)
			{
				m_state = header;
				break;
			}

			if (ch > 16)
			{
				m_size = 0;
				m_cmd = ch;
				m_state = simple_command;
				break;
			}

			m_state = bad;
			break;

		case simple_command:
			m_state = bad;
			break;

		case header:
			m_cmd_size = ch & 0x0f;
			m_cmd = ch >> 4;

			m_size = 0;
			m_state = m_cmd_size == 0? ready: st_data;
			break;

		case st_data:
			m_rx_buffer[m_size++] = ch;
			m_state = m_cmd_size == m_size? ready: st_data;
			break;

		default:
			;
		}

		if (m_state == bad)
		{
			++m_err_cnt;
			return 254;
		}

		if (m_state == simple_command || m_state == ready)
			return m_cmd;

		return 255;
	}
	
	template <typename T>
	bool write(const T& v)
	{
		if(m_tx_ptr >= (16 - sizeof(v)))
			return false;
		uint8_t const* begin = reinterpret_cast<uint8_t const*>(&v);
		for(const uint8_t end = m_tx_ptr + sizeof(v); m_tx_ptr != end; ++m_tx_ptr, ++begin)
			m_tx_buffer[m_tx_ptr] = *begin;
		return true;
	}
	
	template <typename Usart>
	void send(Usart& usart, const uint8_t& cmd)
	{
		usart.write(0x80);
		usart.write(((cmd & 0x0F)<<4) | m_tx_ptr);
		for(uint8_t i = 0; i != m_tx_ptr; ++i)
			usart.write(m_tx_buffer[i]);
		m_tx_ptr = 0;
	}

	state_t state() const { return m_state; }

	uint8_t operator[](uint8_t index) const { return m_rx_buffer[index]; }
		
	template <typename T>
	T read(uint8_t index) { return *reinterpret_cast<T*>(&m_tx_buffer[0] + index); }
		
	uint8_t* get_rx_buffer() { return m_rx_buffer; }
	uint8_t* get_buffer() { return m_rx_buffer; }
		
	uint8_t* get_tx_buffer() { return m_tx_buffer; }

protected:
	state_t m_state;

	uint8_t m_cmd;
	uint8_t m_cmd_size;

	uint8_t m_rx_buffer[16];
	uint8_t m_tx_buffer[16];
	uint8_t m_size;
	uint8_t m_tx_ptr;
	uint16_t m_err_cnt;
};

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

rb::Manager& rbc() 
{
    static rb::Manager m(false);  // ve výchozím stavu se motory po puštění tlačítka vypínají, false zařídí, že pojedou, dokud nedostanou další pokyn 
    return m;
}

Servo servo;

BluetoothSerial SerialBT;
Stream* serial = nullptr;

void setup() {
    Serial.begin(115200);
    if (!SerialBT.begin("RBControl")) //Bluetooth device name
    {
        Serial.println("!!! Bluetooth initialization failed!");
        serial = &Serial;
    }
    else
    {
        serial = &SerialBT;
    }
    servo.attach(25);
    servo.write(90);
}

#define LEFT_MOTOR rb::MotorId::M1
#define RIGHT_MOTOR rb::MotorId::M2

uint32_t t_enc = 0;
command_parser parser;

void loop() {
    if(millis() > t_enc)
    {
        t_enc += 250;
        serial->print(man->encoder(0)->value());
        serial->print(' ');
        serial->println(man->encoder(7)->value());
    }
    man->leds().blue(SerialBT.hasClient());
    if(serial->available()) {
        switch(parser.push_data(serial->read()))
        {
            case 1:
                if (parser.size() >= 9)
                {
                    int fwd = int16_t(parser[0] | (parser[1] << 8));
                    int cross = int16_t(parser[2] | (parser[3] << 8));
                    cross >>= 1;
                    int left = (fwd + cross) >> 8;
                    int right = (fwd - cross) >> 8;
                    Serial.print("fwd: ");
                    Serial.print(fwd);
                    Serial.print(" cross: "); 
                    Serial.print(cross);
                    Serial.print(" left: ");
                    Serial.print(left);
                    Serial.print(" right: ");
                    Serial.print(right);
                    Serial.print(" btn: ");
                    Serial.println(parser[8]);
                    man->setMotors().power(LEFT_MOTOR, left)
                                    .power(RIGHT_MOTOR, right)
                                    .set();
                    servo.write(((parser[8] & (1<<0)) != 0) ? 180 : 90);
                }
                else
                {
                    Serial.print("Wrong length: ");
                    Serial.println(parser.size());
                }
                break;
            case 254:
                parser.clear();
                Serial.println("Bad state");
                break;
            case 255:
                break;
            default:
                Serial.print("Received cmd: ");
                Serial.println(parser.cmd());
                break;
        }
    }
}


#include <Arduino.h>
#include "RBControl_manager.hpp"
#include <Servo.h>
#include "nvs_flash.h"
#include "BluetoothSerial.h"

#if !defined(CONFIG_BT_ENABLED) || !defined(CONFIG_BLUEDROID_ENABLED)
#error Bluetooth is not enabled! Please run `make menuconfig` to and enable it
#endif

rb::Manager& rbc() 
{
    static rb::Manager m(false);  // ve výchozím stavu se motory po puštění tlačítka vypínají, false zařídí, že pojedou, dokud nedostanou další pokyn 
    return m;
}

Servo servo;
BluetoothSerial SerialBT;
Stream* serial = nullptr;

void setup() {
    Serial.begin(115200);
    if (!SerialBT.begin("RBControl")) //Bluetooth device name
    {
        Serial.println("!!! Bluetooth initialization failed!");
        serial = &Serial;
    }
    else
    {
        serial = &SerialBT;
    }
    servo.attach(25);
    servo.write(90);
}

#define LEFT_MOTOR rb::MotorId::M1
#define RIGHT_MOTOR rb::MotorId::M2

uint32_t t_enc = 0;

void loop() {
    if(millis() > t_enc)
    {
        t_enc += 250;
        serial->print(man->encoder(0)->value());
        serial->print(' ');
        serial->println(man->encoder(7)->value());
    }
    if(serial->available()) {
        char c = serial->read();
        switch(c) {
            case 'w':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 's':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case 'a':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 'd':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case ' ':
                man->setMotors().power(LEFT_MOTOR, 0)
                                .power(RIGHT_MOTOR, 0)
                                .set();
                break;
            case 'q':
                servo.write(60);
                break;
            case 'e':
                servo.write(120);
                break;
            case '1' ... '9':
                man->encoder(7)->drive(256 * (c - '0'), 64, nullptr, nullptr);
                man->encoder(0)->drive(256 * (c - '0'), 64, nullptr, nullptr);
                break;
            default:
                serial->write(c);
                break;
        }
    }
}


#include <Arduino.h>
#include "RBControl_manager.hpp"
#include <Servo.h>

rb::Manager& rbc() 
{
    static rb::Manager m(false);  // ve výchozím stavu se motory po puštění tlačítka vypínají, false zařídí, že pojedou, dokud nedostanou další pokyn 
    return m;
}

Servo servo;

void setup() {
    Serial.begin(115200);
    servo.attach(25);
    servo.write(90);
}

#define LEFT_MOTOR  rb::MotorId::M1
#define RIGHT_MOTOR  rb::MotorId::M2

uint32_t t_enc = 0;

void loop() {
    if(millis() > t_enc)
    {
        t_enc += 250;
        Serial.print(man->encoder(0)->value());
        Serial.print(' ');
        Serial.println(man->encoder(7)->value());
    }
    if(Serial.available()) {
        char c = Serial.read();
        switch(c) {
            case 'w':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 's':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case 'a':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 'd':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case ' ':
                man->setMotors().power(LEFT_MOTOR, 0)
                                .power(RIGHT_MOTOR, 0)
                                .set();
                break;
            case 'q':
                servo.write(60);
                break;
            case 'e':
                servo.write(120);
                break;
            case '1' ... '9':
                man->motor(LEFT_MOTOR)->drive(256 * (c - '0'), 64, nullptr);
                man->motor(RIGHT_MOTOR)->drive(256 * (c - '0'), 64, nullptr); // 96 tiků na otáčku
                break;
            default:
                Serial.write(c);
                break;
        }
    }
}


main.cpp


#include <Arduino.h>
#include "RBControl_manager.hpp"
#include <Servo.h>

rb::Manager& rbc() 
{
    static rb::Manager m(false);  // ve výchozím stavu se motory po puštění tlačítka vypínají, false zařídí, že pojedou, dokud nedostanou další pokyn 
    return m;
}

Servo servo;

void setup() {
    Serial.begin(115200);
    servo.attach(25);
    servo.write(90);
}

#define LEFT_MOTOR  rb::MotorId::M1
#define RIGHT_MOTOR  rb::MotorId::M2

void loop() {
    if(Serial.available()) {
        char c = Serial.read();
        switch(c) {
            case 'w':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 's':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case 'a':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 'd':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case ' ':
                man->setMotors().power(LEFT_MOTOR, 0)
                                .power(RIGHT_MOTOR, 0)
                                .set();
                break;
            case 'q':
                servo.write(60);
                break;
            case 'e':
                servo.write(120);
                break;
            default:
                Serial.write(c);
                break;
        }
    }
}


platformio.ini


upload_speed = 921600
monitor_speed = 115200
# upload_port = /dev/ttyUSB0
# upload_port = COM7

lib_deps =  https://github.com/RoboticsBrno/RB3201-RBControl-library.git
            https://github.com/adafruit/Adafruit_TCS34725.git

build_unflags = -std=gnu++11
build_flags =
    -std=c++14
    -fmax-errors=5




#include <Arduino.h>
#include "RBControl_manager.hpp"

rb::Manager& rbc() 
{
    static rb::Manager m(false);  // ve výchozím stavu se motory po puštění tlačítka vypínají, false zařídí, že pojedou, dokud nedostanou další pokyn 
    return m;
}


void setup() {
    Serial.begin(115200);
}

#define LEFT_MOTOR  rb::MotorId::M1
#define RIGHT_MOTOR  rb::MotorId::M2

void loop() {
    if(Serial.available()) {
        char c = Serial.read();
        switch(c) {
            case 'w':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 's':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case 'a':
                man->setMotors().power(LEFT_MOTOR, -32)
                                .power(RIGHT_MOTOR, 32)
                                .set();
                break;
            case 'd':
                man->setMotors().power(LEFT_MOTOR, 32)
                                .power(RIGHT_MOTOR, -32)
                                .set();
                break;
            case ' ':
                man->setMotors().power(LEFT_MOTOR, 0)
                                .power(RIGHT_MOTOR, 0)
                                .set();
                break;
            default:
                Serial.write(c);
                break;
        }
    }
}