Advertisement
Guest User

Untitled

a guest
Jul 22nd, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.78 KB | None | 0 0
  1. #include <Wire.h>
  2.  
  3. #define CAMERA_ADDRESS 0x21
  4.  
  5. // Definitions of functions for manipulating the Arduino boards pins according to each Arduino board registers, so the code will work for both Arduino UNO and Arduino MEGA:
  6. // The only change is the connections of the SDA/SIOD, SCL/SIOC and MCLK/XCLK pins to each board (see the pins configurations above).
  7. #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__) // If you are using Arduino MEGA the IDE will automatically define the "__AVR_ATmega1280__" or "__AVR_ATmega2560__" constants.
  8. #define TIMER2_PWM_A_PIN_MODE_OUTPUT() ({ DDRB |= 0b00010000; })
  9. #define PIN2_DIGITAL_READ() ({ (PINE & 0b00010000) == 0 ? LOW : HIGH; })
  10. #define PIN3_DIGITAL_READ() ({ (PINE & 0b00100000) == 0 ? LOW : HIGH; })
  11. #define PIN4_DIGITAL_READ() ({ (PING & 0b00100000) == 0 ? LOW : HIGH; })
  12. #define PIN5_DIGITAL_READ() ({ (PINE & 0b00001000) == 0 ? LOW : HIGH; })
  13. #define PIN6_DIGITAL_READ() ({ (PINH & 0b00001000) == 0 ? LOW : HIGH; })
  14. #define PIN7_DIGITAL_READ() ({ (PINH & 0b00010000) == 0 ? LOW : HIGH; })
  15. #define PIN8_DIGITAL_READ() ({ (PINH & 0b00100000) == 0 ? LOW : HIGH; })
  16. #define PINA0_DIGITAL_READ() ({ (PINF & 0b00000001) == 0 ? LOW : HIGH; })
  17. #define PINA1_DIGITAL_READ() ({ (PINF & 0b00000010) == 0 ? LOW : HIGH; })
  18. #define PINA2_DIGITAL_READ() ({ (PINF & 0b00000100) == 0 ? LOW : HIGH; })
  19. #define PINA3_DIGITAL_READ() ({ (PINF & 0b00001000) == 0 ? LOW : HIGH; })
  20. #elif defined(__AVR_ATmega328P__) // If you are using Arduino UNO the IDE will automatically define the "__AVR_ATmega328P__" constant.
  21. #define TIMER2_PWM_A_PIN_MODE_OUTPUT() ({ DDRB |= 0b00001000; })
  22. #define PIN2_DIGITAL_READ() ({ (PIND & 0b00000100) == 0 ? LOW : HIGH; })
  23. #define PIN3_DIGITAL_READ() ({ (PIND & 0b00001000) == 0 ? LOW : HIGH; })
  24. #define PIN4_DIGITAL_READ() ({ (PIND & 0b00010000) == 0 ? LOW : HIGH; })
  25. #define PIN5_DIGITAL_READ() ({ (PIND & 0b00100000) == 0 ? LOW : HIGH; })
  26. #define PIN6_DIGITAL_READ() ({ (PIND & 0b01000000) == 0 ? LOW : HIGH; })
  27. #define PIN7_DIGITAL_READ() ({ (PIND & 0b10000000) == 0 ? LOW : HIGH; })
  28. #define PIN8_DIGITAL_READ() ({ (PINB & 0b00000001) == 0 ? LOW : HIGH; })
  29. #define PINA0_DIGITAL_READ() ({ (PINC & 0b00000001) == 0 ? LOW : HIGH; })
  30. #define PINA1_DIGITAL_READ() ({ (PINC & 0b00000010) == 0 ? LOW : HIGH; })
  31. #define PINA2_DIGITAL_READ() ({ (PINC & 0b00000100) == 0 ? LOW : HIGH; })
  32. #define PINA3_DIGITAL_READ() ({ (PINC & 0b00001000) == 0 ? LOW : HIGH; })
  33. #endif
  34.  
  35.  
  36. void initializePWMTimer() {
  37. cli();
  38. TIMER2_PWM_A_PIN_MODE_OUTPUT(); // Set the A PWM pin of TIMER2 to output
  39. ASSR &= ~(_BV(EXCLK) | _BV(AS2));
  40. TCCR2A = (1 << COM2A0) | (1 << WGM21) | (1 << WGM20);
  41. TCCR2B = (1 << WGM22) | (1 << CS20);
  42. OCR2A = 0;
  43. sei();
  44. }
  45.  
  46. byte readCameraRegister(byte registerId) {
  47. Wire.beginTransmission(CAMERA_ADDRESS);
  48. Wire.write(registerId);
  49. Wire.endTransmission();
  50. Wire.requestFrom(CAMERA_ADDRESS, 1);
  51. while (Wire.available() <= 0);
  52. byte registerValue = Wire.read();
  53. delay(1);
  54. return registerValue;
  55. }
  56.  
  57. void writeCameraRegister(byte registerId, byte registerValue) {
  58. Wire.beginTransmission(CAMERA_ADDRESS);
  59. Wire.write(registerId);
  60. Wire.write(registerValue);
  61. Wire.endTransmission();
  62. delay(1);
  63. }
  64.  
  65. void captureFrame(unsigned int frameWidth, unsigned int frameHeight) {
  66. Serial.print("*RDY*"); // send to the frame capture software a "start of frame" message for beginning capturing
  67.  
  68. delay(1000);
  69.  
  70. cli(); // disable all interrupts during frame capture (because it needs to be as fast as possible)
  71. while (PIN3_DIGITAL_READ() == LOW); // wait until VS/VSYNC pin is high
  72. while (PIN3_DIGITAL_READ() == HIGH); // wait until VS/VSYNC pin is low
  73. unsigned int tempWidth = 0;
  74. while (frameHeight--) {
  75. tempWidth = frameWidth;
  76. while (tempWidth--) {
  77. while (PIN2_DIGITAL_READ() == LOW); // wait until PCLK pin is high
  78. while (PIN2_DIGITAL_READ() == HIGH); // wait until PCLK pin is low
  79. byte byteToWrite = 0b00000000;
  80. byteToWrite |= ((PIN7_DIGITAL_READ() == HIGH) << 7);
  81. byteToWrite |= ((PIN6_DIGITAL_READ() == HIGH) << 6);
  82. byteToWrite |= ((PIN5_DIGITAL_READ() == HIGH) << 5);
  83. byteToWrite |= ((PIN4_DIGITAL_READ() == HIGH) << 4);
  84. byteToWrite |= ((PINA3_DIGITAL_READ() == HIGH) << 3);
  85. byteToWrite |= ((PINA2_DIGITAL_READ() == HIGH) << 2);
  86. byteToWrite |= ((PINA1_DIGITAL_READ() == HIGH) << 1);
  87. byteToWrite |= ((PINA0_DIGITAL_READ() == HIGH));
  88. UDR0 = byteToWrite; // send data via serial connection with UART register (we need to use the serial register directly for fast transfer)
  89. while (PIN2_DIGITAL_READ() == LOW); // wait until PCLK pin is high
  90. while (PIN2_DIGITAL_READ() == HIGH); // wait until PCLK pin is low
  91. // ignore each second byte (for a grayscale image we only need each first byte, which represents luminescence)
  92. }
  93. }
  94. sei(); // enable all interrupts
  95.  
  96. delay(1000);
  97. }
  98.  
  99. void setup() {
  100. initializePWMTimer();
  101. Wire.begin();
  102. Serial.begin(1000000); // the frame capture software communicates with the Arduino at a baud rate of 1MHz
  103. initializeCamera();
  104. }
  105.  
  106. void loop() {
  107. captureFrame(320, 240); // capture a frame at QVGA resolution (320 x 240)
  108. }
  109.  
  110.  
  111. void initializeCamera() {
  112. // these are common registers values for initializing the camera to QVGA (320 x 240) mode at the maximum clock prescaler:
  113. //writeCameraRegister(0x12, 0x80); // reset all camera registers to default value
  114. //delay(1000); // wait for reset proccess to be done (because it is quite slow)
  115. writeCameraRegister(0x3A, 0x04);
  116. writeCameraRegister(0x12, 0x00);
  117. writeCameraRegister(0x17, 0x13);
  118. writeCameraRegister(0x18, 0x01);
  119. writeCameraRegister(0x32, 0xB6);
  120. writeCameraRegister(0x19, 0x02);
  121. writeCameraRegister(0x1A, 0x7A);
  122. writeCameraRegister(0x03, 0x0A);
  123. writeCameraRegister(0x0C, 0x00);
  124. writeCameraRegister(0x3E, 0x00);
  125. writeCameraRegister(0x70, 0x3A);
  126. writeCameraRegister(0x71, 0x35);
  127. writeCameraRegister(0x72, 0x11);
  128. writeCameraRegister(0x73, 0xF0);
  129. writeCameraRegister(0xA2, 0x01);
  130. writeCameraRegister(0x15, 0x00);
  131. writeCameraRegister(0x7A, 0x20);
  132. writeCameraRegister(0x7B, 0x10);
  133. writeCameraRegister(0x7C, 0x1E);
  134. writeCameraRegister(0x7D, 0x35);
  135. writeCameraRegister(0x7E, 0x5A);
  136. writeCameraRegister(0x7F, 0x69);
  137. writeCameraRegister(0x80, 0x76);
  138. writeCameraRegister(0x81, 0x80);
  139. writeCameraRegister(0x82, 0x88);
  140. writeCameraRegister(0x83, 0x8F);
  141. writeCameraRegister(0x84, 0x96);
  142. writeCameraRegister(0x85, 0xA3);
  143. writeCameraRegister(0x86, 0xAF);
  144. writeCameraRegister(0x87, 0xC4);
  145. writeCameraRegister(0x88, 0xD7);
  146. writeCameraRegister(0x89, 0xE8);
  147. writeCameraRegister(0x13, 0xC0);
  148. writeCameraRegister(0x00, 0x00);
  149. writeCameraRegister(0x10, 0x00);
  150. writeCameraRegister(0x0D, 0x40);
  151. writeCameraRegister(0x14, 0x18);
  152. writeCameraRegister(0xA5, 0x05);
  153. writeCameraRegister(0xAB, 0x07);
  154. writeCameraRegister(0x24, 0x95);
  155. writeCameraRegister(0x25, 0x33);
  156. writeCameraRegister(0x26, 0xE3);
  157. writeCameraRegister(0x9F, 0x78);
  158. writeCameraRegister(0xA0, 0x68);
  159. writeCameraRegister(0xA1, 0x03);
  160. writeCameraRegister(0xA6, 0xD8);
  161. writeCameraRegister(0xA7, 0xD8);
  162. writeCameraRegister(0xA8, 0xF0);
  163. writeCameraRegister(0xA9, 0x90);
  164. writeCameraRegister(0xAA, 0x94);
  165. writeCameraRegister(0x13, 0xC5);
  166. writeCameraRegister(0x30, 0x00);
  167. writeCameraRegister(0x31, 0x00);
  168. writeCameraRegister(0x0E, 0x61);
  169. writeCameraRegister(0x0F, 0x4B);
  170. writeCameraRegister(0x16, 0x02);
  171. writeCameraRegister(0x1E, 0x07);
  172. writeCameraRegister(0x21, 0x02);
  173. writeCameraRegister(0x22, 0x91);
  174. writeCameraRegister(0x29, 0x07);
  175. writeCameraRegister(0x33, 0x0B);
  176. writeCameraRegister(0x35, 0x0B);
  177. writeCameraRegister(0x37, 0x1D);
  178. writeCameraRegister(0x38, 0x71);
  179. writeCameraRegister(0x39, 0x2A);
  180. writeCameraRegister(0x3C, 0x78);
  181. writeCameraRegister(0x4D, 0x40);
  182. writeCameraRegister(0x4E, 0x20);
  183. writeCameraRegister(0x69, 0x00);
  184. writeCameraRegister(0x74, 0x10);
  185. writeCameraRegister(0x8D, 0x4F);
  186. writeCameraRegister(0x8E, 0x00);
  187. writeCameraRegister(0x8F, 0x00);
  188. writeCameraRegister(0x90, 0x00);
  189. writeCameraRegister(0x91, 0x00);
  190. writeCameraRegister(0x96, 0x00);
  191. writeCameraRegister(0x9A, 0x00);
  192. writeCameraRegister(0xB0, 0x84);
  193. writeCameraRegister(0xB1, 0x0C);
  194. writeCameraRegister(0xB2, 0x0E);
  195. writeCameraRegister(0xB3, 0x82);
  196. writeCameraRegister(0xB8, 0x0A);
  197. writeCameraRegister(0x43, 0x0A);
  198. writeCameraRegister(0x44, 0xF0);
  199. writeCameraRegister(0x45, 0x34);
  200. writeCameraRegister(0x46, 0x58);
  201. writeCameraRegister(0x47, 0x28);
  202. writeCameraRegister(0x48, 0x3A);
  203. writeCameraRegister(0x59, 0x88);
  204. writeCameraRegister(0x5A, 0x88);
  205. writeCameraRegister(0x5B, 0x44);
  206. writeCameraRegister(0x5C, 0x67);
  207. writeCameraRegister(0x5D, 0x49);
  208. writeCameraRegister(0x5E, 0x0E);
  209. writeCameraRegister(0x6C, 0x0A);
  210. writeCameraRegister(0x6D, 0x55);
  211. writeCameraRegister(0x6E, 0x11);
  212. writeCameraRegister(0x6F, 0x9E);
  213. writeCameraRegister(0x6A, 0x40);
  214. writeCameraRegister(0x01, 0x40);
  215. writeCameraRegister(0x02, 0x60);
  216. writeCameraRegister(0x13, 0xC7);
  217. writeCameraRegister(0x4F, 0x80);
  218. writeCameraRegister(0x50, 0x80);
  219. writeCameraRegister(0x51, 0x00);
  220. writeCameraRegister(0x52, 0x22);
  221. writeCameraRegister(0x53, 0x5E);
  222. writeCameraRegister(0x54, 0x80);
  223. writeCameraRegister(0x58, 0x9E);
  224. writeCameraRegister(0x41, 0x08);
  225. writeCameraRegister(0x3F, 0x00);
  226. writeCameraRegister(0x75, 0x05);
  227. writeCameraRegister(0x76, 0xE1);
  228. writeCameraRegister(0x4C, 0x00);
  229. writeCameraRegister(0x77, 0x01);
  230. writeCameraRegister(0x3D, 0x48);
  231. writeCameraRegister(0x4B, 0x09);
  232. writeCameraRegister(0xC9, 0x60);
  233. writeCameraRegister(0x56, 0x40);
  234. writeCameraRegister(0x34, 0x11);
  235. writeCameraRegister(0x3B, 0x12);
  236. writeCameraRegister(0xA4, 0x82);
  237. writeCameraRegister(0x96, 0x00);
  238. writeCameraRegister(0x97, 0x30);
  239. writeCameraRegister(0x98, 0x20);
  240. writeCameraRegister(0x99, 0x30);
  241. writeCameraRegister(0x9A, 0x84);
  242. writeCameraRegister(0x9B, 0x29);
  243. writeCameraRegister(0x9C, 0x03);
  244. writeCameraRegister(0x9D, 0x4C);
  245. writeCameraRegister(0x9E, 0x3F);
  246. writeCameraRegister(0x78, 0x04);
  247. writeCameraRegister(0x79, 0x01);
  248. writeCameraRegister(0xC8, 0xF0);
  249. writeCameraRegister(0x79, 0x0F);
  250. writeCameraRegister(0xC8, 0x00);
  251. writeCameraRegister(0x79, 0x10);
  252. writeCameraRegister(0xC8, 0x7E);
  253. writeCameraRegister(0x79, 0x0A);
  254. writeCameraRegister(0xC8, 0x80);
  255. writeCameraRegister(0x79, 0x0B);
  256. writeCameraRegister(0xC8, 0x01);
  257. writeCameraRegister(0x79, 0x0C);
  258. writeCameraRegister(0xC8, 0x0F);
  259. writeCameraRegister(0x79, 0x0D);
  260. writeCameraRegister(0xC8, 0x20);
  261. writeCameraRegister(0x79, 0x09);
  262. writeCameraRegister(0xC8, 0x80);
  263. writeCameraRegister(0x79, 0x02);
  264. writeCameraRegister(0xC8, 0xC0);
  265. writeCameraRegister(0x79, 0x03);
  266. writeCameraRegister(0xC8, 0x40);
  267. writeCameraRegister(0x79, 0x05);
  268. writeCameraRegister(0xC8, 0x30);
  269. writeCameraRegister(0x79, 0x26);
  270. writeCameraRegister(0xFF, 0xFF);
  271. writeCameraRegister(0x15, 0x20);
  272. writeCameraRegister(0x0C, 0x04);
  273. writeCameraRegister(0x3E, 0x19);
  274. writeCameraRegister(0x72, 0x11);
  275. writeCameraRegister(0x73, 0xF1);
  276. writeCameraRegister(0x17, 0x16);
  277. writeCameraRegister(0x18, 0x04);
  278. writeCameraRegister(0x32, 0xA4);
  279. writeCameraRegister(0x19, 0x02);
  280. writeCameraRegister(0x1A, 0x7A);
  281. writeCameraRegister(0x03, 0x0A);
  282. writeCameraRegister(0xFF, 0xFF);
  283. writeCameraRegister(0x12, 0x00);
  284. writeCameraRegister(0x8C, 0x00);
  285. writeCameraRegister(0x04, 0x00);
  286. writeCameraRegister(0x40, 0xC0);
  287. writeCameraRegister(0x14, 0x6A);
  288. writeCameraRegister(0x4F, 0x80);
  289. writeCameraRegister(0x50, 0x80);
  290. writeCameraRegister(0x51, 0x00);
  291. writeCameraRegister(0x52, 0x22);
  292. writeCameraRegister(0x53, 0x5E);
  293. writeCameraRegister(0x54, 0x80);
  294. writeCameraRegister(0x3D, 0x40);
  295. writeCameraRegister(0xFF, 0xFF);
  296. writeCameraRegister(0x11, 0x1F);
  297. writeCameraRegister(0x0C, 0x08);
  298. writeCameraRegister(0x3E, 0x19);
  299. writeCameraRegister(0x73, 0xF1);
  300. writeCameraRegister(0x12, 0x10);
  301. delay(1000); // wait for registers to be set (because it is quite slow)
  302. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement