Specify which degree for PID possible!

This commit is contained in:
FluffyCube9343 2023-03-11 14:37:26 -05:00
parent ba534ad8ac
commit f5a5693023
4 changed files with 130 additions and 108 deletions
Comms-Rewrite/bouncer
P_control_Code
RaspPi-flask-recieve

View File

@ -15,6 +15,7 @@ void setup(){
} }
void loop(){ void loop(){
if(Serial.available() > 0) { if(Serial.available() > 0) {
String data = Serial.readStringUntil('\n'); String data = Serial.readStringUntil('\n');
@ -22,6 +23,9 @@ void loop(){
Serial.print("Hi Raspberry Pi! You sent me: "); Serial.print("Hi Raspberry Pi! You sent me: ");
Serial.println(String(i)); Serial.println(String(i));
i+=1;} i+=1;}
else{
Serial.println(data);
}
} }
} }

View File

@ -28,7 +28,7 @@
// Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation // Arduino Wire library is required if I2Cdev I2CDEV_ARDUINO_WIRE implementation
// is used in I2Cdev.h // is used in I2Cdev.h
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
#include "Wire.h" #include "Wire.h"
#endif #endif
// class default I2C address is 0x68 // class default I2C address is 0x68
@ -43,7 +43,7 @@ MPU6050 mpu(0x69); // <-- use for AD0 high
depends on the MPU-6050's INT pin being connected to the Arduino's depends on the MPU-6050's INT pin being connected to the Arduino's
external interrupt #0 pin. On the Arduino Uno and Mega 2560, this is external interrupt #0 pin. On the Arduino Uno and Mega 2560, this is
digital I/O pin 2. digital I/O pin 2.
* ========================================================================= */ ========================================================================= */
/* ========================================================================= /* =========================================================================
NOTE: Arduino v1.0.1 with the Leonardo board generates a compile error NOTE: Arduino v1.0.1 with the Leonardo board generates a compile error
@ -54,7 +54,7 @@ MPU6050 mpu(0x69); // <-- use for AD0 high
http://arduino.cc/forum/index.php/topic,109987.0.html http://arduino.cc/forum/index.php/topic,109987.0.html
http://code.google.com/p/arduino/issues/detail?id=958 http://code.google.com/p/arduino/issues/detail?id=958
* ========================================================================= */ ========================================================================= */
@ -75,7 +75,7 @@ double dererr = 0.0;
double toc = millis(); double toc = millis();
Servo myservo; Servo myservo;
// uncomment "OUTPUT_READABLE_QUATERNION" if you want to see the actual // uncomment "OUTPUT_READABLE_QUATERNION" if you want to see the actual
@ -137,7 +137,7 @@ float euler[3]; // [psi, theta, phi] Euler angle container
float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector float ypr[3]; // [yaw, pitch, roll] yaw/pitch/roll container and gravity vector
// packet structure for InvenSense teapot demo // packet structure for InvenSense teapot demo
uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\n' }; uint8_t teapotPacket[14] = { '$', 0x02, 0, 0, 0, 0, 0, 0, 0, 0, 0x00, 0x00, '\r', '\n' };
@ -147,7 +147,7 @@ uint8_t teapotPacket[14] = { '$', 0x02, 0,0, 0,0, 0,0, 0,0, 0x00, 0x00, '\r', '\
volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high volatile bool mpuInterrupt = false; // indicates whether MPU interrupt pin has gone high
void dmpDataReady() { void dmpDataReady() {
mpuInterrupt = true; mpuInterrupt = true;
} }
@ -158,88 +158,84 @@ void dmpDataReady() {
void setup() { void setup() {
myservo.attach(3);
// join I2C bus (I2Cdev library doesn't do this automatically)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin();
Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
// initialize serial communication myservo.attach(3);
// (115200 chosen because it is required for Teapot Demo output, but it's // join I2C bus (I2Cdev library doesn't do this automatically)
// really up to you depending on your project) #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Serial.begin(115200); Wire.begin();
while (!Serial); // wait for Leonardo enumeration, others continue immediately Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true);
#endif
// NOTE: 8MHz or slower host processors, like the Teensy @ 3.3V or Arduino // initialize serial communication
// Pro Mini running at 3.3V, cannot handle this baud rate reliably due to // (115200 chosen because it is required for Teapot Demo output, but it's
// the baud timing being too misaligned with processor ticks. You must use // really up to you depending on your project)
// 38400 or slower in these cases, or use some kind of external separate Serial.begin(9600);
// crystal solution for the UART timer. while (!Serial); // wait for Leonardo enumeration, others continue immediately
// initialize device // NOTE: 8MHz or slower host processors, like the Teensy @ 3.3V or Arduino
Serial.println(F("Initializing I2C devices...")); // Pro Mini running at 3.3V, cannot handle this baud rate reliably due to
mpu.initialize(); // the baud timing being too misaligned with processor ticks. You must use
pinMode(INTERRUPT_PIN, INPUT); // 38400 or slower in these cases, or use some kind of external separate
// crystal solution for the UART timer.
// verify connection // initialize device
Serial.println(F("Testing device connections...")); Serial.println(F("Initializing I2C devices..."));
Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT);
// wait for ready // verify connection
Serial.println(F("\nSend any character to begin DMP programming and demo: ")); Serial.println(F("Testing device connections..."));
while (Serial.available() && Serial.read()); // empty buffer Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));
while (!Serial.available()); // wait for data
while (Serial.available() && Serial.read()); // empty buffer again
// load and configure the DMP // wait for ready
Serial.println(F("Initializing DMP...")); Serial.println(F("\nSend any character to begin DMP programming and demo: "));
devStatus = mpu.dmpInitialize(); // load and configure the DMP
Serial.println(F("Initializing DMP..."));
devStatus = mpu.dmpInitialize();
// supply your own gyro offsets here, scaled for min sensitivity // supply your own gyro offsets here, scaled for min sensitivity
mpu.setXGyroOffset(220); mpu.setXGyroOffset(220);
mpu.setYGyroOffset(76); mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85); mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip mpu.setZAccelOffset(1788); // 1688 factory default for my test chip
// make sure it worked (returns 0 if so) // make sure it worked (returns 0 if so)
if (devStatus == 0) { if (devStatus == 0) {
// Calibration Time: generate offsets and calibrate our MPU6050 // Calibration Time: generate offsets and calibrate our MPU6050
mpu.CalibrateAccel(6); mpu.CalibrateAccel(6);
mpu.CalibrateGyro(6); mpu.CalibrateGyro(6);
mpu.PrintActiveOffsets(); mpu.PrintActiveOffsets();
// turn on the DMP, now that it's ready // turn on the DMP, now that it's ready
Serial.println(F("Enabling DMP...")); Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true); mpu.setDMPEnabled(true);
// enable Arduino interrupt detection // enable Arduino interrupt detection
Serial.print(F("Enabling interrupt detection (Arduino external interrupt ")); Serial.print(F("Enabling interrupt detection (Arduino external interrupt "));
Serial.print(digitalPinToInterrupt(INTERRUPT_PIN)); Serial.print(digitalPinToInterrupt(INTERRUPT_PIN));
Serial.println(F(")...")); Serial.println(F(")..."));
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING); attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus(); mpuIntStatus = mpu.getIntStatus();
// set our DMP Ready flag so the main loop() function knows it's okay to use it // set our DMP Ready flag so the main loop() function knows it's okay to use it
Serial.println(F("DMP ready! Waiting for first interrupt...")); Serial.println(F("DMP ready! Waiting for first interrupt..."));
dmpReady = true; dmpReady = true;
// get expected DMP packet size for later comparison // get expected DMP packet size for later comparison
packetSize = mpu.dmpGetFIFOPacketSize(); packetSize = mpu.dmpGetFIFOPacketSize();
} else { } else {
// ERROR! // ERROR!
// 1 = initial memory load failed // 1 = initial memory load failed
// 2 = DMP configuration updates failed // 2 = DMP configuration updates failed
// (if it's going to break, usually the code will be 1) // (if it's going to break, usually the code will be 1)
Serial.print(F("DMP Initialization failed (code ")); Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus); Serial.print(devStatus);
Serial.println(F(")")); Serial.println(F(")"));
} }
// configure LED for outputj // configure LED for outputj
pinMode(LED_PIN, OUTPUT); pinMode(LED_PIN, OUTPUT);
} }
@ -249,41 +245,50 @@ myservo.attach(3);
// ================================================================ // ================================================================
void loop() { void loop() {
tic = toc; tic = toc;
// if programming failed, don't try to do anything if (Serial.available() > 0) {
if (!dmpReady) return; String data = Serial.readStringUntil('\n');
// read a packet from FIFO int data2 = data.toInt();
if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) { // Get the Latest packet goal = data2;
}
Serial.print(goal);
Serial.print("\t");
// if programming failed, don't try to do anything
if (!dmpReady) return;
// read a packet from FIFO
if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) { // Get the Latest packet
#ifdef OUTPUT_READABLE_YAWPITCHROLL #ifdef OUTPUT_READABLE_YAWPITCHROLL
// display Euler angles in degrees // display Euler angles in degrees
mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
//Serial.print("ypr\t"); //Serial.print("ypr\t");
Serial.print(ypr[0] * 180/M_PI); Serial.print(ypr[0] * 180 / M_PI);
Serial.print("\t"); Serial.print("\t");
//Serial.print(ypr[1] * 180/M_PI); //Serial.print(ypr[1] * 180/M_PI);
//Serial.print("\t"); //Serial.print("\t");
//Serial.println(ypr[2] * 180/M_PI); //Serial.println(ypr[2] * 180/M_PI);
toc = millis(); toc = millis();
//dererr = (properr - (goal-ypr[0]))/(toc-tic); //dererr = (properr - (goal-ypr[0]))/(toc-tic);
properr = goal-ypr[0]; properr = goal * M_PI / 180 - ypr[0];
//interr += properr * (toc-tic); Serial.print(ypr[0]);
Serial.println(properr*kp); Serial.print("\t");
int toRot = properr*kp; //interr += properr * (toc-tic);
int Rot = max(min(1500-toRot,2000),1000); Serial.println(properr * kp);
myservo.writeMicroseconds(Rot); int toRot = properr * kp;
int Rot = max(min(1500 - toRot, 2000), 1000);
myservo.writeMicroseconds(Rot);
#endif
// blink LED to indicate activity
blinkState = !blinkState; #endif
digitalWrite(LED_PIN, blinkState);
} // blink LED to indicate activity
blinkState = !blinkState;
digitalWrite(LED_PIN, blinkState);
}
} }

View File

@ -0,0 +1,13 @@
import socket
host=''
port=2345
s=socket.socket()
s.bind((host,port))
s.listen(10)
while True:
conn,addr=s.accept()
print("Connected by",addr)
data=conn.recv(1024)
print("received data:",data)
conn.send(data)
conn.close()

View File

@ -28,5 +28,5 @@ while True:
receive_string = ser.readline().decode('utf-8').rstrip() receive_string = ser.readline().decode('utf-8').rstrip()
print(receive_string) print(receive_string)
conn.send(receive_string.encode()) conn.send(data)
conn.close() conn.close()