As my final project needs a mechanism to rotate and flip, I was really looking forward to this week's assignment so that though the process of doing it, I would have a better idea of how to proceed for my final project. In my mind, I know I would be working with some kind of motors, but exactly what type, I was not so certain until this week. I was reading this book called Making things move and I was able to have a better understanding of what different motors do.
I will be trying to drive 2 x 9G micro servo with a microcontroller board, not because they are special but because they are available in the lab. The datasheet of the motors states the following specifications:
The sample board on our class page looks like this:
After discussing with the local instructor, we were advised to redesign the board using another microcontroller chip, the ATtiny45, and also to build the board without a 5V regulator and a 20MHz crystal. Referring to the datasheet of ATtiny45, and comparing the pins assignment with the t44, I made some notes on my memo pad. Scribbling down and drawing the diagram really helped, and I found myself referring to this scribble ever so often when I was working in Eagle to design the schematic and the board.
I soon realised that ATtiny85 microcontroller is not compatible with the "servo.h" library in Arduino because ATtiny85 only has 8 bit counters, whereas Servo-library relies on having a 16-bit timer available. If I were using the ATtiny44, it would pose no issue because ATtiny44 has a 16 bit counters. I tried to workaround this by trying out two other libraries "servo8bit.h" and "SoftwareServo.h". It seems that SoftwareServo.h is okay to use.
#includeSoftwareServo myServo1; SoftwareServo myServo2; int angle = 0; void setup() { myServo1.attach(0); myServo2.attach(3); } void loop(){ for(angle = 1; angle < 180; angle++) { myServo1.write(angle); delay(20); myServo2.write(angle); delay(10); SoftwareServo::refresh(); } for(angle = 180; angle > 1; angle--) { myServo1.write(angle); delay(20); myServo2.write(angle); delay(10); SoftwareServo::refresh(); } }
I was only able to document the WinAVR programming process in week 13 when in fact, this topic has been covered as early as week 4. At that time I didn't understand C programming and was trying very hard to avoid avrdude which I couldn't understand. So all the while, I have been using Arduino IDE to flash my chip. It is only now that I am a little more ready to face the challenge and try to understand about AVR programming. I think this is a huge leap for me and I am happy to have a better understanding about AVR programming. For windows users, we need to download WinAVR.
1. cp hello.servo.44.2.make makefile // compiling the c program into a "makefile" 2. make // generate 2 files; the .hex file and the .out file 3. avrdude -P com4 -c stk500v1 -b 19200 -p t45 -U flash:w:hello.servo.44.2.c.hex //stk500v1 is my arduino programmer; //t45 is the ATtiny45 chipset; //hello.servo.44.c.hex is the hex file you want to flashBecause of the changes to my board and the change of chipset to ATtiny45, the following modifications to the C programme is essential:
#define PWM_port PORTB // ATtiny45 only has PortB #define PWM_direction DDRB // Data Direction Registers B #define PWM_pin_0 (1 << PB0) // PortB Pin0 #define PWM_pin_1 (1 << PB3) // PortB Pin3Changes required in the make file:
MMCU=ATtiny45 // and all occurrence of t44 will be replaced by t45 F_CPU = 8000000 // Instead of an 20MHz external crystal, we are using 8MHz internal clockSuccessfully flashing the microchip set:
C:\Users\yoruichin\Dropbox\FAB\Week 13 - Output\servo\2ch>cp hello.servo.44.2.make makefile C:\Users\yoruichin\Dropbox\FAB\Week 13 - Output\servo\2ch>make avr-gcc -mmcu=attiny45 -Wall -Os -DF_CPU=9600 -I./ -o hello.servo.44.2.out hello.servo.44.2.c avr-objcopy -O ihex hello.servo.44.2.out hello.servo.44.2.c.hex;\ avr-size --mcu=attiny45 --format=avr hello.servo.44.2.out AVR Memory Usage ---------------- Device: attiny45 Program: 312 bytes (7.6% Full) (.text + .data + .bootloader) Data: 0 bytes (0.0% Full) (.data + .bss + .noinit) C:\Users\yoruichin\Dropbox\FAB\Week 13 - Output\servo\2ch> C:\Users\yoruichin\Dropbox\FAB\Week 13 - Output\servo\2ch>avrdude -P com4 -c stk500v1 -b 19200 -p t45 -U flash:w:hello.servo.44.2.c.hex avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny45 avrdude: AVR device initialized and ready to accept instructions Reading | ################################################## | 100% 0.03s avrdude: Device signature = 0x1e9206 avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed To disable this feature, specify the -D option. avrdude: erasing chip avrdude: please define PAGEL and BS2 signals in the configuration file for part ATtiny45 avrdude: reading input file "hello.servo.44.2.c.hex" avrdude: input file hello.servo.44.2.c.hex auto detected as Intel Hex avrdude: writing flash (332 bytes): Writing | ################################################## | 100% 0.53s avrdude: 332 bytes of flash written avrdude: verifying flash memory against hello.servo.44.2.c.hex: avrdude: load data flash data from input file hello.servo.44.2.c.hex: avrdude: input file hello.servo.44.2.c.hex auto detected as Intel Hex avrdude: input file hello.servo.44.2.c.hex contains 332 bytes avrdude: reading on-chip flash data: Reading | ################################################## | 100% 0.27s avrdude: verifying ... avrdude: 332 bytes of flash verified avrdude: safemode: Fuses OK avrdude done. Thank you. C:\Users\yoruichin\Dropbox\FAB\Week 13 - Output\servo\2ch>