Advertisement
Agno

Untitled

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