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

View File

@ -16,12 +16,16 @@ void setup(){
void loop(){ void loop(){
if(Serial.available() > 0) { if(Serial.available() > 0) {
String data = Serial.readStringUntil('\n'); String data = Serial.readStringUntil('\n');
if(data=="Data"){ if(data=="Data"){
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
* ========================================================================= */ ========================================================================= */
@ -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;
} }
@ -159,87 +159,83 @@ void dmpDataReady() {
void setup() { void setup() {
myservo.attach(3); myservo.attach(3);
// join I2C bus (I2Cdev library doesn't do this automatically) // join I2C bus (I2Cdev library doesn't do this automatically)
#if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE #if I2CDEV_IMPLEMENTATION == I2CDEV_ARDUINO_WIRE
Wire.begin(); Wire.begin();
Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties Wire.setClock(400000); // 400kHz I2C clock. Comment this line if having compilation difficulties
#elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE #elif I2CDEV_IMPLEMENTATION == I2CDEV_BUILTIN_FASTWIRE
Fastwire::setup(400, true); Fastwire::setup(400, true);
#endif #endif
// initialize serial communication // initialize serial communication
// (115200 chosen because it is required for Teapot Demo output, but it's // (115200 chosen because it is required for Teapot Demo output, but it's
// really up to you depending on your project) // really up to you depending on your project)
Serial.begin(115200); Serial.begin(9600);
while (!Serial); // wait for Leonardo enumeration, others continue immediately while (!Serial); // wait for Leonardo enumeration, others continue immediately
// NOTE: 8MHz or slower host processors, like the Teensy @ 3.3V or Arduino // NOTE: 8MHz or slower host processors, like the Teensy @ 3.3V or Arduino
// Pro Mini running at 3.3V, cannot handle this baud rate reliably due to // Pro Mini running at 3.3V, cannot handle this baud rate reliably due to
// the baud timing being too misaligned with processor ticks. You must use // the baud timing being too misaligned with processor ticks. You must use
// 38400 or slower in these cases, or use some kind of external separate // 38400 or slower in these cases, or use some kind of external separate
// crystal solution for the UART timer. // crystal solution for the UART timer.
// initialize device // initialize device
Serial.println(F("Initializing I2C devices...")); Serial.println(F("Initializing I2C devices..."));
mpu.initialize(); mpu.initialize();
pinMode(INTERRUPT_PIN, INPUT); pinMode(INTERRUPT_PIN, INPUT);
// verify connection // verify connection
Serial.println(F("Testing device connections...")); Serial.println(F("Testing device connections..."));
Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed")); Serial.println(mpu.testConnection() ? F("MPU6050 connection successful") : F("MPU6050 connection failed"));
// wait for ready // wait for ready
Serial.println(F("\nSend any character to begin DMP programming and demo: ")); Serial.println(F("\nSend any character to begin DMP programming and demo: "));
while (Serial.available() && Serial.read()); // empty buffer // load and configure the DMP
while (!Serial.available()); // wait for data Serial.println(F("Initializing DMP..."));
while (Serial.available() && Serial.read()); // empty buffer again devStatus = mpu.dmpInitialize();
// load and configure the DMP // supply your own gyro offsets here, scaled for min sensitivity
Serial.println(F("Initializing DMP...")); mpu.setXGyroOffset(220);
devStatus = mpu.dmpInitialize(); mpu.setYGyroOffset(76);
mpu.setZGyroOffset(-85);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip
// supply your own gyro offsets here, scaled for min sensitivity // make sure it worked (returns 0 if so)
mpu.setXGyroOffset(220); if (devStatus == 0) {
mpu.setYGyroOffset(76); // Calibration Time: generate offsets and calibrate our MPU6050
mpu.setZGyroOffset(-85); mpu.CalibrateAccel(6);
mpu.setZAccelOffset(1788); // 1688 factory default for my test chip mpu.CalibrateGyro(6);
mpu.PrintActiveOffsets();
// turn on the DMP, now that it's ready
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
// make sure it worked (returns 0 if so) // enable Arduino interrupt detection
if (devStatus == 0) { Serial.print(F("Enabling interrupt detection (Arduino external interrupt "));
// Calibration Time: generate offsets and calibrate our MPU6050 Serial.print(digitalPinToInterrupt(INTERRUPT_PIN));
mpu.CalibrateAccel(6); Serial.println(F(")..."));
mpu.CalibrateGyro(6); attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
mpu.PrintActiveOffsets(); mpuIntStatus = mpu.getIntStatus();
// turn on the DMP, now that it's ready
Serial.println(F("Enabling DMP..."));
mpu.setDMPEnabled(true);
// enable Arduino interrupt detection // set our DMP Ready flag so the main loop() function knows it's okay to use it
Serial.print(F("Enabling interrupt detection (Arduino external interrupt ")); Serial.println(F("DMP ready! Waiting for first interrupt..."));
Serial.print(digitalPinToInterrupt(INTERRUPT_PIN)); dmpReady = true;
Serial.println(F(")..."));
attachInterrupt(digitalPinToInterrupt(INTERRUPT_PIN), dmpDataReady, RISING);
mpuIntStatus = mpu.getIntStatus();
// set our DMP Ready flag so the main loop() function knows it's okay to use it // get expected DMP packet size for later comparison
Serial.println(F("DMP ready! Waiting for first interrupt...")); packetSize = mpu.dmpGetFIFOPacketSize();
dmpReady = true; } else {
// ERROR!
// 1 = initial memory load failed
// 2 = DMP configuration updates failed
// (if it's going to break, usually the code will be 1)
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
// get expected DMP packet size for later comparison // configure LED for outputj
packetSize = mpu.dmpGetFIFOPacketSize(); pinMode(LED_PIN, OUTPUT);
} else {
// ERROR!
// 1 = initial memory load failed
// 2 = DMP configuration updates failed
// (if it's going to break, usually the code will be 1)
Serial.print(F("DMP Initialization failed (code "));
Serial.print(devStatus);
Serial.println(F(")"));
}
// configure LED for outputj
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 #endif
// blink LED to indicate activity // blink LED to indicate activity
blinkState = !blinkState; blinkState = !blinkState;
digitalWrite(LED_PIN, 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()