Advertisement
Agno

Untitled

Nov 13th, 2019
192
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.82 KB | None | 0 0
  1. #include <SPI.h>
  2. #include <RF24.h>
  3. const int MPU = 0x68; // MPU6050 I2C address
  4. float accAngleX, accAngleY;
  5. float accAngleErrorX, accAngleErrorY;
  6. float accX, accY, accZ;
  7.  
  8. const int i2cspeed = 10;
  9.  
  10. RF24 radio(9, 10);
  11.  
  12. int angles[2];
  13.  
  14. const uint64_t pipe = 0xE8E8F0F0E1LL;
  15.  
  16. void setup() {
  17. pinMode(A5, OUTPUT);
  18. Serial.begin(57600);
  19. i2c_init;
  20. radio.begin();
  21. radio.openWritingPipe(pipe);
  22. Serial.println("init accel");
  23.  
  24. delay(1000);
  25. }
  26. void loop() {
  27. readAccelRaw(MPU, A4, A5);
  28.  
  29. accAngleX = atan(accX / sqrt(pow(accY, 2) + pow(accZ, 2 ))) / (PI / 180);
  30. accAngleY = atan(accY / sqrt(pow(accX, 2) + pow(accZ, 2 ))) / (PI / 180);
  31.  
  32. // Serial.print("X: ");
  33. // Serial.print(accAngleX);
  34. // Serial.print(" | Y: ");
  35. // Serial.println(accAngleY);
  36. angles[0] = (int) accAngleX;
  37. angles[1] = (int) accAngleY;
  38. radio.write(angles, sizeof(angles));
  39. }
  40.  
  41. void readAccelRaw(byte devaddress, int sda, int scl) {
  42. uint8_t xlb, xhb, ylb, yhb, zlb, zhb;
  43. // beginTransmission(devaddress, sda, scl);
  44. // i2c_write(0x3B, sda, scl);
  45. // endTransmission(sda, scl);
  46. // requestFrom(devaddress, sda, scl);
  47. // xhg = i2c_read(sda, scl);
  48. // ack(sda, scl);
  49. // xlg = i2c_read(sda, scl);
  50. // ack(sda, scl);
  51. // yhg = i2c_read(sda, scl);
  52. // ack(sda, scl);
  53. // ylg = i2c_read(sda, scl);
  54. // ack(sda, scl);
  55. // zhg = i2c_read(sda, scl);
  56. // ack(sda, scl);
  57. // zlg = i2c_read(sda, scl);
  58. // nack(sda, scl);
  59. // endTransmission(sda, scl);
  60. xhb = getReading(devaddress, 0x3B, sda, scl);
  61. xlb = getReading(devaddress, 0x3C, sda, scl);
  62. yhb = getReading(devaddress, 0x3D, sda, scl);
  63. ylb = getReading(devaddress, 0x3E, sda, scl);
  64. zhb = getReading(devaddress, 0x3F, sda, scl);
  65. zlb = getReading(devaddress, 0x40, sda, scl);
  66. accX = (xhb << 8 | xlb) / 16384.0;
  67. accY = (yhb << 8 | ylb) / 16384.0;
  68. accZ = (zhb << 8 | zlb) / 16384.0;
  69. }
  70.  
  71. uint8_t getReading(uint8_t devaddress, uint8_t regaddress, int sda, int scl) {
  72. beginTransmission(devaddress, sda, scl);
  73. i2c_write(regaddress, sda, scl);
  74. endTransmission(sda, scl);
  75. requestFrom(devaddress, sda, scl);
  76. uint8_t reply = i2c_read(sda, scl);
  77. nack(sda, scl);
  78. endTransmission(sda, scl);
  79. return reply;
  80. }
  81.  
  82. void ack(int sda, int scl) {
  83. pinMode(sda, OUTPUT);
  84. digitalWrite(sda, LOW);
  85. delayMicroseconds(i2cspeed);
  86. digitalWrite(scl, HIGH);
  87. delayMicroseconds(i2cspeed);
  88. digitalWrite(scl, LOW);
  89. digitalWrite(sda, HIGH);
  90. }
  91.  
  92. void nack(int sda, int scl) {
  93. pinMode(sda, OUTPUT);
  94. digitalWrite(sda, HIGH);
  95. delayMicroseconds(i2cspeed);
  96. digitalWrite(scl, HIGH);
  97. delayMicroseconds(i2cspeed);
  98. digitalWrite(scl, LOW);
  99. digitalWrite(sda, HIGH);
  100. }
  101.  
  102. void i2c_init(int sda, int scl) {
  103. pinMode(sda, OUTPUT);
  104. digitalWrite(sda, HIGH);
  105. delayMicroseconds(i2cspeed);
  106.  
  107. digitalWrite(scl, HIGH);
  108. }
  109.  
  110.  
  111. void i2c_start(int sda, int scl) {
  112. pinMode(sda, OUTPUT);
  113. digitalWrite(sda, LOW);
  114. delayMicroseconds(i2cspeed);
  115.  
  116. digitalWrite(scl, LOW);
  117. }
  118.  
  119. void i2c_stop(int sda, int scl) {
  120. digitalWrite(scl, LOW);
  121. delayMicroseconds(i2cspeed);
  122. digitalWrite(sda, LOW);
  123. delayMicroseconds(i2cspeed);
  124. digitalWrite(scl, HIGH);
  125. delayMicroseconds(i2cspeed);
  126. pinMode(sda, OUTPUT);
  127. digitalWrite(sda, HIGH);
  128. }
  129.  
  130.  
  131. uint8_t beginTransmission(uint8_t address, int sda, int scl) {
  132. i2c_start(sda, scl);
  133. i2c_write((address << 1) | 0, sda, scl);
  134. return i2c_readbit(sda, scl);
  135. }
  136.  
  137.  
  138. uint8_t requestFrom(uint8_t address, int sda, int scl)
  139. {
  140. i2c_start(sda, scl);
  141. i2c_write((address << 1) | 1, sda, scl); // set read bit
  142. return i2c_readbit(sda, scl);
  143. }
  144.  
  145. uint8_t endTransmission(int sda, int scl)
  146. {
  147. i2c_stop(sda, scl);
  148. return 0;
  149. }
  150.  
  151. void i2c_write( uint8_t c , int sda, int scl)
  152. {
  153. for ( uint8_t i = 0; i < 8; i++) {
  154. i2c_writebit( c & 128 , sda, scl);
  155. if (i < 7)
  156. c <<= 1;
  157. }
  158. //return i2c_readbit(sda, scl);
  159.  
  160. }
  161.  
  162. uint8_t i2c_read(int sda, int scl)
  163. {
  164. uint8_t res = 0;
  165.  
  166. for ( uint8_t i = 0; i < 8; i++) {
  167. res <<= 1;
  168. res |= i2c_readbit(sda, scl);
  169. //Serial.println(res);
  170. }
  171. return res;
  172. }
  173.  
  174. void i2c_writebit( uint8_t c, int sda, int scl )
  175. {
  176. delayMicroseconds(i2cspeed);
  177.  
  178. if ( c > 0 ) {
  179. pinMode(sda, OUTPUT);
  180. digitalWrite(sda, HIGH);
  181. } else {
  182. pinMode(sda, OUTPUT);
  183. digitalWrite(sda, LOW);
  184. }
  185. delayMicroseconds(i2cspeed);
  186.  
  187.  
  188. digitalWrite(scl, HIGH);
  189. delayMicroseconds(i2cspeed);
  190.  
  191.  
  192. digitalWrite(scl, LOW);
  193. delayMicroseconds(i2cspeed);
  194.  
  195. }
  196.  
  197. //
  198. uint8_t i2c_readbit(int sda, int scl)
  199. {
  200. delayMicroseconds(i2cspeed);
  201. pinMode(sda, INPUT);
  202. digitalWrite(scl, LOW);
  203. delayMicroseconds(i2cspeed);
  204. digitalWrite(scl, HIGH);
  205. delayMicroseconds(i2cspeed);
  206. uint8_t i2creadbit = digitalRead(sda);
  207. digitalWrite(scl, LOW);
  208.  
  209. delayMicroseconds(i2cspeed);
  210.  
  211. return i2creadbit;
  212. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement