Popravki senzor kode, sprejemnika in monitor skripte
parent
e9df3c13ae
commit
a78110dc80
|
@ -3,5 +3,6 @@
|
|||
source .venv/bin/activate
|
||||
|
||||
port=${1:-/dev/ttyACM0}
|
||||
rate=${2:-230400}
|
||||
|
||||
pio device monitor -b 115200 -p "$port"
|
||||
pio device monitor -b "$rate" -p "$port"
|
||||
|
|
|
@ -39,12 +39,10 @@
|
|||
// id, address
|
||||
Adafruit_BNO055 bno = Adafruit_BNO055(55, 0x28);
|
||||
|
||||
/**************************************************************************/
|
||||
/*
|
||||
Displays some basic information on this sensor from the unified
|
||||
sensor API sensor_t type (see Adafruit_Sensor for more information)
|
||||
*/
|
||||
/**************************************************************************/
|
||||
/************************************************************************
|
||||
* Displays some basic information on this sensor from the unified *
|
||||
* sensor API sensor_t type (see Adafruit_Sensor for more information) *
|
||||
***********************************************************************/
|
||||
void displaySensorDetails(void)
|
||||
{
|
||||
sensor_t sensor;
|
||||
|
@ -61,13 +59,10 @@ void displaySensorDetails(void)
|
|||
delay(500);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*
|
||||
Display some basic info about the sensor status
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displaySensorStatus(void)
|
||||
{
|
||||
/****************************************************
|
||||
* Display some basic info about the sensor status *
|
||||
***************************************************/
|
||||
void displaySensorStatus(void) {
|
||||
/* Get the system status values (mostly for debugging purposes) */
|
||||
uint8_t system_status, self_test_results, system_error;
|
||||
system_status = self_test_results = system_error = 0;
|
||||
|
@ -85,13 +80,10 @@ void displaySensorStatus(void)
|
|||
delay(500);
|
||||
}
|
||||
|
||||
/**************************************************************************/
|
||||
/*
|
||||
Display sensor calibration status
|
||||
*/
|
||||
/**************************************************************************/
|
||||
void displayCalStatus(void)
|
||||
{
|
||||
/*************************************
|
||||
* Display sensor calibration status *
|
||||
*************************************/
|
||||
void displayCalStatus(void) {
|
||||
/* Get the four calibration values (0..3) */
|
||||
/* Any sensor data reporting 0 should be ignored, */
|
||||
/* 3 means 'fully calibrated" */
|
||||
|
@ -101,9 +93,8 @@ void displayCalStatus(void)
|
|||
|
||||
/* The data should be ignored until the system calibration is > 0 */
|
||||
Serial.print("\t");
|
||||
if (!system)
|
||||
{
|
||||
Serial.print("! ");
|
||||
if (!system) {
|
||||
Serial.print("! ");
|
||||
}
|
||||
|
||||
/* Display the individual values */
|
||||
|
@ -155,140 +146,53 @@ void displaySensorOffsets(const adafruit_bno055_offsets_t &calibData)
|
|||
|
||||
int eeprom_size;
|
||||
|
||||
void setup(void)
|
||||
{
|
||||
Serial.begin(115200);
|
||||
delay(8000);
|
||||
Serial.println("Orientation Sensor Test"); Serial.println("");
|
||||
void setup(void) {
|
||||
Serial.begin(115200);
|
||||
delay(8000);
|
||||
Serial.println("Orientation Sensor Test"); Serial.println("");
|
||||
|
||||
/* Initialise the sensor */
|
||||
if (!bno.begin())
|
||||
{
|
||||
/* There was a problem detecting the BNO055 ... check your connections */
|
||||
Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
|
||||
while (1);
|
||||
}
|
||||
/* Initialise the sensor */
|
||||
if (!bno.begin()) {
|
||||
/* There was a problem detecting the BNO055 ... check your connections */
|
||||
Serial.print("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
|
||||
while (1);
|
||||
}
|
||||
|
||||
// EEPROM init
|
||||
eeprom_size = sizeof(long) + sizeof(adafruit_bno055_offsets_t);
|
||||
EEPROM.begin(eeprom_size);
|
||||
// EEPROM init
|
||||
eeprom_size = sizeof(adafruit_bno055_offsets_t);
|
||||
EEPROM.begin(eeprom_size);
|
||||
|
||||
Serial.print("EEPROM init (len ");
|
||||
Serial.print(EEPROM.length());
|
||||
Serial.println(")\n");
|
||||
Serial.print("EEPROM init (len ");
|
||||
Serial.print(EEPROM.length());
|
||||
Serial.println(")\n");
|
||||
|
||||
int eeAddress = 0;
|
||||
long bnoID;
|
||||
bool foundCalib = false;
|
||||
adafruit_bno055_offsets_t calibrationData;
|
||||
sensor_t sensor;
|
||||
|
||||
EEPROM.get(eeAddress, bnoID);
|
||||
bno.getSensor(&sensor);
|
||||
EEPROM.get(0, calibrationData);
|
||||
|
||||
adafruit_bno055_offsets_t calibrationData;
|
||||
sensor_t sensor;
|
||||
Serial.println("\n\nCalibration data in EEPROM");
|
||||
displaySensorOffsets(calibrationData);
|
||||
|
||||
/*
|
||||
* Look for the sensor's unique ID at the beginning oF EEPROM.
|
||||
* This isn't foolproof, but it's better than nothing.
|
||||
*/
|
||||
bno.getSensor(&sensor);
|
||||
if (bnoID != sensor.sensor_id)
|
||||
{
|
||||
Serial.println("\nNo Calibration Data for this sensor exists in EEPROM");
|
||||
delay(500);
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("\nFound Calibration for this sensor in EEPROM.");
|
||||
eeAddress += sizeof(long);
|
||||
EEPROM.get(eeAddress, calibrationData);
|
||||
delay(1000);
|
||||
|
||||
displaySensorOffsets(calibrationData);
|
||||
/* Display some basic information on this sensor */
|
||||
displaySensorDetails();
|
||||
|
||||
Serial.println("\n\nRestoring Calibration data to the BNO055...");
|
||||
bno.setSensorOffsets(calibrationData);
|
||||
/* Optional: Display current status */
|
||||
displaySensorStatus();
|
||||
|
||||
Serial.println("\n\nCalibration data loaded into BNO055");
|
||||
foundCalib = true;
|
||||
}
|
||||
/* Crystal must be configured AFTER loading calibration data into BNO055. */
|
||||
bno.setExtCrystalUse(true);
|
||||
|
||||
delay(1000);
|
||||
sensors_event_t event;
|
||||
bno.getEvent(&event);
|
||||
|
||||
/* Display some basic information on this sensor */
|
||||
displaySensorDetails();
|
||||
|
||||
/* Optional: Display current status */
|
||||
displaySensorStatus();
|
||||
|
||||
/* Crystal must be configured AFTER loading calibration data into BNO055. */
|
||||
bno.setExtCrystalUse(true);
|
||||
|
||||
sensors_event_t event;
|
||||
bno.getEvent(&event);
|
||||
/* always recal the mag as It goes out of calibration very often */
|
||||
if (foundCalib){
|
||||
Serial.println("Move sensor slightly to calibrate magnetometers");
|
||||
while (!bno.isFullyCalibrated())
|
||||
{
|
||||
bno.getEvent(&event);
|
||||
delay(BNO055_SAMPLERATE_DELAY_MS);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Serial.println("Please Calibrate Sensor: ");
|
||||
while (!bno.isFullyCalibrated())
|
||||
{
|
||||
bno.getEvent(&event);
|
||||
|
||||
Serial.print("X: ");
|
||||
Serial.print(event.orientation.x, 4);
|
||||
Serial.print("\tY: ");
|
||||
Serial.print(event.orientation.y, 4);
|
||||
Serial.print("\tZ: ");
|
||||
Serial.print(event.orientation.z, 4);
|
||||
|
||||
/* Optional: Display calibration status */
|
||||
displayCalStatus();
|
||||
|
||||
/* New line for the next sample */
|
||||
Serial.println("");
|
||||
|
||||
/* Wait the specified delay before requesting new data */
|
||||
delay(BNO055_SAMPLERATE_DELAY_MS);
|
||||
}
|
||||
}
|
||||
|
||||
Serial.println("\nFully calibrated!");
|
||||
Serial.println("--------------------------------");
|
||||
Serial.println("Calibration Results: ");
|
||||
adafruit_bno055_offsets_t newCalib;
|
||||
bno.getSensorOffsets(newCalib);
|
||||
displaySensorOffsets(newCalib);
|
||||
|
||||
Serial.println("\n\nStoring calibration data to EEPROM...");
|
||||
|
||||
eeAddress = 0;
|
||||
bno.getSensor(&sensor);
|
||||
bnoID = sensor.sensor_id;
|
||||
|
||||
EEPROM.put(eeAddress, bnoID);
|
||||
|
||||
eeAddress += sizeof(long);
|
||||
EEPROM.put(eeAddress, newCalib);
|
||||
EEPROM.commit();
|
||||
Serial.println("Data stored to EEPROM.");
|
||||
|
||||
Serial.println("\n--------------------------------\n");
|
||||
delay(500);
|
||||
while (1) {};
|
||||
}
|
||||
|
||||
void loop() {
|
||||
/* Get a new sensor event */
|
||||
sensors_event_t event;
|
||||
Serial.println("Please Calibrate Sensor: ");
|
||||
while (!bno.isFullyCalibrated()) {
|
||||
bno.getEvent(&event);
|
||||
|
||||
/* Display the floating point data */
|
||||
Serial.print("X: ");
|
||||
Serial.print(event.orientation.x, 4);
|
||||
Serial.print("\tY: ");
|
||||
|
@ -299,12 +203,53 @@ void loop() {
|
|||
/* Optional: Display calibration status */
|
||||
displayCalStatus();
|
||||
|
||||
/* Optional: Display sensor status (debug only) */
|
||||
//displaySensorStatus();
|
||||
|
||||
/* New line for the next sample */
|
||||
Serial.println("");
|
||||
|
||||
/* Wait the specified delay before requesting new data */
|
||||
delay(BNO055_SAMPLERATE_DELAY_MS);
|
||||
/* Wait the specified delay before requesting new data */
|
||||
delay(BNO055_SAMPLERATE_DELAY_MS);
|
||||
}
|
||||
|
||||
Serial.println("\nFully calibrated!");
|
||||
Serial.println("--------------------------------");
|
||||
Serial.println("Calibration Results: ");
|
||||
adafruit_bno055_offsets_t newCalib;
|
||||
bno.getSensorOffsets(newCalib);
|
||||
displaySensorOffsets(newCalib);
|
||||
|
||||
Serial.println("\n\nStoring calibration data to EEPROM...");
|
||||
|
||||
EEPROM.put(0, newCalib);
|
||||
EEPROM.commit();
|
||||
Serial.println("Data stored to EEPROM.");
|
||||
|
||||
Serial.println("\n--------------------------------\n");
|
||||
delay(500);
|
||||
while (1) {};
|
||||
}
|
||||
|
||||
void loop() {
|
||||
/* Get a new sensor event */
|
||||
sensors_event_t event;
|
||||
bno.getEvent(&event);
|
||||
|
||||
/* Display the floating point data */
|
||||
Serial.print("X: ");
|
||||
Serial.print(event.orientation.x, 4);
|
||||
Serial.print("\tY: ");
|
||||
Serial.print(event.orientation.y, 4);
|
||||
Serial.print("\tZ: ");
|
||||
Serial.print(event.orientation.z, 4);
|
||||
|
||||
/* Optional: Display calibration status */
|
||||
displayCalStatus();
|
||||
|
||||
/* Optional: Display sensor status (debug only) */
|
||||
//displaySensorStatus();
|
||||
|
||||
/* New line for the next sample */
|
||||
Serial.println("");
|
||||
|
||||
/* Wait the specified delay before requesting new data */
|
||||
delay(BNO055_SAMPLERATE_DELAY_MS);
|
||||
}
|
||||
|
|
156
src/main.cpp
156
src/main.cpp
|
@ -4,7 +4,7 @@
|
|||
#include <EEPROM.h>
|
||||
|
||||
// ID senzorja mora bit unikaten! (se poslje poleg parametrov)
|
||||
#define SENSOR_ID 6
|
||||
#define SENSOR_ID 7
|
||||
|
||||
// Stanje baterije
|
||||
#define BATTERY_PIN 2
|
||||
|
@ -17,7 +17,7 @@
|
|||
#define LED_PIN 17
|
||||
|
||||
// debagiranje!
|
||||
//#define DEBUG
|
||||
#define DEBUG
|
||||
|
||||
// I²C pins
|
||||
#define SDA_PIN 8
|
||||
|
@ -34,8 +34,15 @@
|
|||
#include <esp_now.h>
|
||||
#include <WiFi.h>
|
||||
|
||||
// MAC naslov laptopa (linux sprejemnik)
|
||||
//uint8_t sprejemnikMac[] = { 0x9c, 0xb6, 0xd0, 0xc4, 0xe8, 0xb9 };
|
||||
// MAC naslov sprejemnika
|
||||
uint8_t sprejemnikMac[] = { 0x08, 0x3A, 0xF2, 0x50, 0xEF, 0x6C };
|
||||
// MAC naslov sprejemnika2: 08:3A:F2:50:EF:6D
|
||||
//uint8_t sprejemnikMac[] = {0x08, 0x3A, 0xF2, 0x50, 0xEF, 0x6D};
|
||||
|
||||
// wifi kanal
|
||||
#define KANAL 1
|
||||
|
||||
// Comp
|
||||
sensor_msg odcitek;
|
||||
|
@ -48,12 +55,11 @@ sensor_t ensor;
|
|||
imu::Quaternion quat;
|
||||
imu::Vector<3> linearAccel;
|
||||
|
||||
int cas = 0;
|
||||
unsigned long cas_bat = 0;
|
||||
unsigned long cas_uspeh = 0;
|
||||
|
||||
// EEPROM za kalibracijo
|
||||
int eeprom_size;
|
||||
/* Set the delay between fresh samples (calibration) */
|
||||
#define BNO055_SAMPLERATE_DELAY_MS (100)
|
||||
|
||||
void error_blink() {
|
||||
while(1) {
|
||||
|
@ -65,6 +71,9 @@ void error_blink() {
|
|||
}
|
||||
|
||||
void setup() {
|
||||
// Nizja CPU frekvenca - je dovolj (za stevilo wifi paketov - ~100 na sekundo)!
|
||||
//setCpuFrequencyMhz(160);
|
||||
|
||||
// Basic(debug) serial init
|
||||
Serial.begin(115200); // set this as high as you can reliably run on your platform
|
||||
Serial.println("Starting up...");
|
||||
|
@ -76,26 +85,34 @@ void setup() {
|
|||
// Init - 3 one second blinks
|
||||
pinMode(LED_PIN, OUTPUT);
|
||||
for (int i = 0; i < 3; i++) {
|
||||
#ifdef DEBUG
|
||||
Serial.println(i + 1);
|
||||
#endif
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
delay(500);
|
||||
digitalWrite(LED_PIN, HIGH);
|
||||
delay(500);
|
||||
}
|
||||
|
||||
digitalWrite(LED_PIN, LOW);
|
||||
|
||||
// WIFI init
|
||||
WiFi.mode(WIFI_STA);
|
||||
if (esp_now_init() != ESP_OK) {
|
||||
#ifdef DEBUG
|
||||
Serial.println("Error initializing ESP-NOW");
|
||||
#endif
|
||||
error_blink();
|
||||
}
|
||||
|
||||
memcpy(peerInfo.peer_addr, sprejemnikMac, 6);
|
||||
peerInfo.channel = 0;
|
||||
peerInfo.channel = KANAL;
|
||||
peerInfo.encrypt = false;
|
||||
|
||||
if (esp_now_add_peer(&peerInfo) != ESP_OK){
|
||||
#ifdef DEBUG
|
||||
Serial.println("WIFI registracija ni uspela");
|
||||
#endif
|
||||
error_blink();
|
||||
}
|
||||
|
||||
|
@ -103,23 +120,20 @@ void setup() {
|
|||
|
||||
if (!bno.begin(OPERATION_MODE_NDOF)) {
|
||||
/* There was a problem detecting the BNO055 ... check your connections */
|
||||
#ifdef DEBUG
|
||||
Serial.println("Ooops, no BNO055 detected ... Check your wiring or I2C ADDR!");
|
||||
#endif
|
||||
error_blink();
|
||||
}
|
||||
|
||||
// EEPROM init
|
||||
eeprom_size = sizeof(long) + sizeof(adafruit_bno055_offsets_t);
|
||||
EEPROM.begin(eeprom_size);
|
||||
#ifdef DEBUG
|
||||
Serial.print("EEPROM init (len ");
|
||||
Serial.print(EEPROM.length());
|
||||
Serial.println(")\n");
|
||||
|
||||
// Fetch calibration
|
||||
int eeAddress = 0;
|
||||
long bnoID;
|
||||
bool foundCalib = false;
|
||||
|
||||
EEPROM.get(eeAddress, bnoID);
|
||||
#endif
|
||||
|
||||
adafruit_bno055_offsets_t calibrationData;
|
||||
sensor_t sensor;
|
||||
|
@ -129,25 +143,23 @@ void setup() {
|
|||
* This isn't foolproof, but it's better than nothing.
|
||||
*/
|
||||
bno.getSensor(&sensor);
|
||||
if (bnoID != sensor.sensor_id) {
|
||||
Serial.println("\nNo Calibration Data for this sensor exists in EEPROM");
|
||||
delay(500);
|
||||
} else {
|
||||
Serial.println("\nFound Calibration for this sensor in EEPROM.");
|
||||
eeAddress += sizeof(long);
|
||||
EEPROM.get(eeAddress, calibrationData);
|
||||
EEPROM.get(0, calibrationData);
|
||||
|
||||
Serial.println("\n\nRestoring Calibration data to the BNO055...");
|
||||
bno.setSensorOffsets(calibrationData);
|
||||
#ifdef DEBUG
|
||||
Serial.println("\n\nRestoring Calibration data to the BNO055...");
|
||||
#endif
|
||||
bno.setSensorOffsets(calibrationData);
|
||||
|
||||
Serial.println("\n\nCalibration data loaded into BNO055");
|
||||
}
|
||||
#ifdef DEBUG
|
||||
Serial.println("\n\nCalibration data loaded into BNO055");
|
||||
#endif
|
||||
|
||||
delay(1000);
|
||||
|
||||
/* Use external crystal for better accuracy? */
|
||||
/* Crystal must be configured AFTER loading calibration data into BNO055. */
|
||||
bno.setExtCrystalUse(true);
|
||||
//bno.setExtCrystalUse(false);
|
||||
|
||||
delay(1000);
|
||||
|
||||
|
@ -155,16 +167,22 @@ void setup() {
|
|||
bno.getEvent(&event);
|
||||
|
||||
/* always recal the mag as It goes out of calibration very often */
|
||||
if (foundCalib){
|
||||
Serial.println("Move sensor slightly to calibrate magnetometers");
|
||||
while (!bno.isFullyCalibrated()) {
|
||||
bno.getEvent(&event);
|
||||
delay(BNO055_SAMPLERATE_DELAY_MS);
|
||||
}
|
||||
/*
|
||||
while (!bno.isFullyCalibrated()) {
|
||||
bno.getEvent(&event);
|
||||
delay(100);
|
||||
#ifdef DEBUG
|
||||
Serial.println("Calibrating...");
|
||||
#endif
|
||||
}
|
||||
|
||||
delay(1000);
|
||||
|
||||
#ifdef DEBUG
|
||||
Serial.println("Calibrated!");
|
||||
#endif
|
||||
*/
|
||||
|
||||
/* Change mode to sensor fusion */
|
||||
bno.setMode(OPERATION_MODE_NDOF);
|
||||
|
||||
|
@ -177,22 +195,39 @@ void setup() {
|
|||
odcitek.id = SENSOR_ID;
|
||||
|
||||
// Initial time
|
||||
cas = millis();
|
||||
cas_bat = millis();
|
||||
}
|
||||
|
||||
// Read battery (from example T7 sketch)
|
||||
uint32_t readADC_Cal(int ADC_Raw)
|
||||
{
|
||||
esp_adc_cal_characteristics_t adc_chars;
|
||||
uint32_t readADC_Cal(int ADC_Raw) {
|
||||
esp_adc_cal_characteristics_t adc_chars;
|
||||
|
||||
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
|
||||
return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars));
|
||||
esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars);
|
||||
return (esp_adc_cal_raw_to_voltage(ADC_Raw, &adc_chars));
|
||||
}
|
||||
|
||||
void loop() {
|
||||
/* Get a new sensor event */
|
||||
//sensors_event_t event;
|
||||
//bno.getEvent(&event);
|
||||
// Get linear acceleration (3 * 2bytes)
|
||||
linearAccel = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);
|
||||
if (abs(linearAccel.x()) > abs(odcitek.aX)) {
|
||||
odcitek.aX = linearAccel.x();
|
||||
}
|
||||
if (abs(linearAccel.y()) > abs(odcitek.aY)) {
|
||||
odcitek.aY = linearAccel.y();
|
||||
}
|
||||
if (abs(linearAccel.z()) > abs(odcitek.aZ)) {
|
||||
odcitek.aZ = linearAccel.z();
|
||||
}
|
||||
|
||||
// Najvec 1 na sekundo
|
||||
if ((millis() - cas_uspeh) < 9) {
|
||||
delay(1);
|
||||
#ifdef DEBUG
|
||||
Serial.println("preskocim..");
|
||||
#endif
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Get quat (fusion mode); 4 * 2bytes
|
||||
quat = bno.getQuat();
|
||||
|
@ -201,7 +236,7 @@ void loop() {
|
|||
odcitek.qZ = quat.z();
|
||||
odcitek.qW = quat.w();
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef DEBUG
|
||||
Serial.print(F("Quat: "));
|
||||
Serial.print((float)odcitek.qX);
|
||||
Serial.print(F(" "));
|
||||
|
@ -211,24 +246,9 @@ void loop() {
|
|||
Serial.print(F(" "));
|
||||
Serial.print((float)odcitek.qW);
|
||||
Serial.println("");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
// Each second, read the battery
|
||||
// @TODO use something more precise, like https://github.com/rlogiacco/BatterySense ?
|
||||
if (millis() - cas > 1000) {
|
||||
cas = millis();
|
||||
odcitek.bat = (float) (readADC_Cal(analogRead(BATTERY_PIN)) * 2) / 1000;
|
||||
}
|
||||
|
||||
// Get linear acceleration (3 * 2bytes)
|
||||
linearAccel = bno.getVector(Adafruit_BNO055::VECTOR_LINEARACCEL);
|
||||
odcitek.aX = linearAccel.x();
|
||||
odcitek.aY = linearAccel.y();
|
||||
odcitek.aZ = linearAccel.z();
|
||||
|
||||
#ifdef DEBUG
|
||||
#ifdef DEBUG
|
||||
Serial.print(F("Linear acceleration: "));
|
||||
Serial.print((float)odcitek.aX);
|
||||
Serial.print(F(" "));
|
||||
|
@ -236,17 +256,31 @@ void loop() {
|
|||
Serial.print(F(" "));
|
||||
Serial.print((float)odcitek.aZ);
|
||||
Serial.println("");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
// Each second, read the battery
|
||||
// @TODO use something more precise, like https://github.com/rlogiacco/BatterySense ?
|
||||
if (millis() - cas_bat > 1000) {
|
||||
cas_bat = millis();
|
||||
odcitek.bat = (float) (readADC_Cal(analogRead(BATTERY_PIN)) * 2) / 1000;
|
||||
}
|
||||
|
||||
esp_err_t result = esp_now_send(sprejemnikMac, (uint8_t *) &odcitek, sizeof(odcitek));
|
||||
|
||||
#ifdef DEBUG
|
||||
if (result == ESP_OK) {
|
||||
#ifdef DEBUG
|
||||
Serial.println("Uspesno poslano");
|
||||
#endif
|
||||
cas_uspeh = millis();
|
||||
odcitek.aX = 0;
|
||||
odcitek.aY = 0;
|
||||
odcitek.aZ = 0;
|
||||
} else {
|
||||
Serial.println("Napaka pri posiljanju");
|
||||
#ifdef DEBUG
|
||||
Serial.print("Napaka pri posiljanju (");
|
||||
Serial.print(esp_err_to_name(result));
|
||||
Serial.println(")");
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
|
|
@ -21,6 +21,9 @@ SLIPEncodedUSBSerial SLIPSerial(Serial);
|
|||
// MAC naslov sprejemnika: 08:3A:F2:50:EF:6C
|
||||
uint8_t newMACAddress[] = {0x08, 0x3A, 0xF2, 0x50, 0xEF, 0x6C};
|
||||
|
||||
// MAC naslov laptopa (linux sprejemnik)
|
||||
//uint8_t newMACAddress[] = { 0x9c, 0xb6, 0xd0, 0xc4, 0xe8, 0xb9 };
|
||||
|
||||
// Maksimalno stevilo
|
||||
#define ST_SPREJEMNIKOV 10
|
||||
|
||||
|
@ -65,7 +68,7 @@ void prejemPodatkov(const uint8_t * mac_addr, const uint8_t * noviPodatki, int l
|
|||
|
||||
void setup() {
|
||||
// Nizja CPU frekvenca
|
||||
//setCpuFrequencyMhz(80);
|
||||
setCpuFrequencyMhz(160);
|
||||
//SLIPSerial.begin(115200);
|
||||
SLIPSerial.begin(230400);
|
||||
|
||||
|
|
|
@ -0,0 +1,415 @@
|
|||
/************************
|
||||
* MIDI / OSC MAPIRANJE *
|
||||
***********************/
|
||||
|
||||
NetAddr.langPort;
|
||||
|
||||
/***********************************
|
||||
* OSC MAPPING: Povezava na simona *
|
||||
**********************************/
|
||||
(
|
||||
|
||||
~simonIP = "10.42.1.2";
|
||||
~oscS = NetAddr.new(~simonIP, 57120);
|
||||
OSCFunc.trace(true); // debug osc
|
||||
OSCFunc.trace(false); // debug osc
|
||||
|
||||
~senzorji.keys.do({ |id|
|
||||
~senzorji[id].postln;
|
||||
|
||||
OSCdef.new((\accOSC ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accX", msg[1].linlin(-50, 50, 0, 1));
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accY", msg[2].linlin(-50, 50, 0, 1));
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accZ", msg[3].linlin(-50, 50, 0, 1));
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accSum", msg[4].linlin(-50, 50, 0, 1));
|
||||
}, "/acc/" ++ id);
|
||||
|
||||
OSCdef.new((\eulerOSC ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
//[pitch, roll, yaw].postln;
|
||||
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/pitch", pitch);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/roll", roll);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/yaw", yaw);
|
||||
//["simon", pitch, roll, yaw].postln;
|
||||
}, "/euler/" ++ id);
|
||||
});
|
||||
|
||||
)
|
||||
|
||||
|
||||
|
||||
/************************************
|
||||
* MIDI MAPPING: Povezava na boruta *
|
||||
***********************************/
|
||||
|
||||
// Midi mapping funkcija
|
||||
|
||||
(
|
||||
~midiVals = Dictionary.new;
|
||||
~sendMidi = { | chan=0, cc=0, val=0 |
|
||||
var key = chan.asString ++ "_" ++ cc, v = val;
|
||||
v = val.floor.clip(0, 127);
|
||||
if ((~midiVals[key] == nil) || (~midiVals[key] != val)) {
|
||||
~midiVals[key] = val;
|
||||
~midi.control(chan, cc, val);
|
||||
["midi " ++ ~map, chan, cc, v].postln;
|
||||
};
|
||||
};
|
||||
)
|
||||
|
||||
// MIDI MAP I
|
||||
(
|
||||
|
||||
"MIDI MAP I !!!".postln;
|
||||
~map = "I";
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw, freq, gain;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
// quick 16 (1) = frekvenca, quick 17 (2) = gain
|
||||
switch (id,
|
||||
4, {
|
||||
freq = roll;
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, freq * 127);
|
||||
},
|
||||
1, {
|
||||
gain = yaw;
|
||||
if (gain <= 0.5, {
|
||||
gain = 0.5 - gain;
|
||||
}, {
|
||||
gain = gain - 0.5;
|
||||
});
|
||||
~sendMidi.value(0, 17, 64 + (gain * 127));
|
||||
}
|
||||
);
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].linlin(-50, 50, 0, 1);
|
||||
accZ = msg[3].linlin(-50, 50, 0, 1);
|
||||
accSum = msg[4].linlin(-50, 50, 0, 1);
|
||||
|
||||
/*
|
||||
switch (id,
|
||||
3, {
|
||||
~sendMidi.value(0, 19, (accX * 127).floor);
|
||||
~sendMidi.value(0, 20, (accY * 127).floor);
|
||||
~sendMidi.value(0, 21, (accZ * 127).floor);
|
||||
}
|
||||
);
|
||||
*/
|
||||
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
// MIDI MAP II
|
||||
(
|
||||
|
||||
~map = "II";
|
||||
"MIDI MAP II !!!".postln;
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
// MORPHING EFEKT
|
||||
switch (id,
|
||||
4, {
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, (-20 + (yaw * 150)).floor);
|
||||
},
|
||||
3, {
|
||||
~sendMidi.value(0, 17, (-20 + (roll * 150).floor));
|
||||
}
|
||||
);
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].linlin(-50, 50, 0, 1);
|
||||
accZ = msg[3].linlin(-50, 50, 0, 1);
|
||||
accSum = msg[4].linlin(-50, 50, 0, 1);
|
||||
|
||||
/*
|
||||
switch (id,
|
||||
3, {
|
||||
~sendMidi.value(0, 19, (accX * 127).floor);
|
||||
~sendMidi.value(0, 20, (accY * 127).floor);
|
||||
~sendMidi.value(0, 21, (accZ * 127).floor);
|
||||
}
|
||||
);
|
||||
*/
|
||||
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
// MIDI MAP III
|
||||
(
|
||||
|
||||
"MIDI MAP III !!!".postln;
|
||||
~map = "III";
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
switch (id,
|
||||
3, {
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, (pitch * 127));
|
||||
},
|
||||
4, {
|
||||
~sendMidi.value(0, 17, (pitch * 127));
|
||||
}
|
||||
);
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].linlin(-50, 50, 0, 1);
|
||||
accZ = msg[3].linlin(-50, 50, 0, 1);
|
||||
accSum = msg[4].linlin(-50, 50, 0, 1);
|
||||
|
||||
accSum = accSum - 0.5;
|
||||
switch (id,
|
||||
4, {
|
||||
~sendMidi.value(0, 18, (accSum * 256).floor);
|
||||
}
|
||||
);
|
||||
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
// MIDI MAP IV (II)
|
||||
(
|
||||
|
||||
~map = "IV";
|
||||
"MIDI MAP IV (II) !!!".postln;
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
// MORPHING EFEKT
|
||||
switch (id,
|
||||
4, {
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, (-15 + (yaw * 150)).floor);
|
||||
},
|
||||
3, {
|
||||
~sendMidi.value(0, 17, (-15 + (roll * 150).floor));
|
||||
}
|
||||
);
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].linlin(-50, 50, 0, 1);
|
||||
accZ = msg[3].linlin(-50, 50, 0, 1);
|
||||
accSum = msg[4].linlin(-50, 50, 0, 1);
|
||||
|
||||
/*
|
||||
switch (id,
|
||||
3, {
|
||||
~sendMidi.value(0, 19, (accX * 127).floor);
|
||||
}
|
||||
);
|
||||
*/
|
||||
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
(
|
||||
|
||||
"MIDI MAP V (III) !!!".postln;
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
// MORPHING EFEKT
|
||||
switch (id,
|
||||
4, {
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, (-15 + (yaw * 150)).floor);
|
||||
},
|
||||
3, {
|
||||
~sendMidi.value(0, 17, (-15 + (roll * 150).floor));
|
||||
}
|
||||
);
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].linlin(-50, 50, 0, 1);
|
||||
accZ = msg[3].linlin(-50, 50, 0, 1);
|
||||
accSum = msg[4].linlin(-50, 50, 0, 1);
|
||||
|
||||
/*
|
||||
switch (id,
|
||||
3, {
|
||||
~sendMidi.value(0, 19, (accX * 127).floor);
|
||||
~sendMidi.value(0, 20, (accY * 127).floor);
|
||||
~sendMidi.value(0, 21, (accZ * 127).floor);
|
||||
}
|
||||
);
|
||||
*/
|
||||
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
|
||||
(
|
||||
|
||||
"MIDI MAP VI (III) !!!".postln;
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
switch (id,
|
||||
3, {
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, (pitch * 127).floor);
|
||||
~sendMidi.value(0, 17, (yaw * 127).floor);
|
||||
}
|
||||
);
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].linlin(-50, 50, 0, 1);
|
||||
accZ = msg[3].linlin(-50, 50, 0, 1);
|
||||
accSum = msg[4].linlin(-50, 50, 0, 1);
|
||||
|
||||
accSum = accSum - 0.5;
|
||||
switch (id,
|
||||
4, {
|
||||
//~sendMidi.value(0, 18, (accSum * 200).floor);
|
||||
}
|
||||
);
|
||||
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
(
|
||||
"MIDI MAP VII (2)".postln;
|
||||
~senzorji.keys.do({ |id|
|
||||
|
||||
OSCdef.new((\eulerMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
var pitch, roll, yaw;
|
||||
|
||||
// vrtenje sinusoidiziramo, da ni preskokov
|
||||
pitch = msg[1].sin.linlin(-pi, pi, 0, 1);
|
||||
roll = msg[2].sin.linlin(-pi, pi, 0, 1);
|
||||
yaw = msg[3].sin.linlin(-pi, pi, 0, 1);
|
||||
|
||||
// BITCRUSH EFEKT
|
||||
/*
|
||||
switch (id,
|
||||
4, {
|
||||
// Quick slots 1-3
|
||||
~sendMidi.value(0, 16, (-15 + (yaw * 150)).floor);
|
||||
},
|
||||
3, {
|
||||
~sendMidi.value(0, 17, (-15 + (roll * 150).floor));
|
||||
}
|
||||
);
|
||||
*/
|
||||
}, "/euler/" ++ id);
|
||||
|
||||
OSCdef.new((\accMIDI ++ id).asSymbol, { |msg, time, addr, recvPort|
|
||||
// Pospeski: gremo od 0 ali iz sredine?
|
||||
var accX, accY, accZ, accSum;
|
||||
accX = msg[1].abs.linlin(-50, 50, 0, 1);
|
||||
accY = msg[2].abs.linlin(0, 50, 0, 1);
|
||||
accZ = msg[3].abs.linlin(0, 50, 0, 1);
|
||||
accSum = msg[4].linlin(0, 50, 0, 1);
|
||||
|
||||
switch (id,
|
||||
3, {
|
||||
~sendMidi.value(0, 16, (accX * 127));
|
||||
~sendMidi.value(0, 17, (accY * 127));
|
||||
}
|
||||
);
|
||||
}, "/acc/" ++ id);
|
||||
});
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// VDMX mapping setup za simona - dedicated controls
|
||||
|
||||
(
|
||||
|
||||
~senzorji.keys.do({|id|
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/pitch", 0.5);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/roll", 0.5);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/yaw", 0.5);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accX", 0.5);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accY", 0.5);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accZ", 0.5);
|
||||
~oscS.sendMsg("/senzor/" ++ id ++ "/accSum", 0.5);
|
||||
});
|
||||
|
||||
)
|
Loading…
Reference in New Issue