unmanned aerial vehicle

174
Unmanned Aerial Vehicle Page 1 Arab Academy for Science and Technology and Maritime Transport College of Engineering and Technology Department of Computer Engineering UNMANNED AERIAL VEHICLE (UAV) Presented by: Alexander Mohamed Osman Riyad Ahmed El-laithy Ruyyan Ahmed El-laithy Peter Raouf Zaky Supervised by: Dr. Ibrahim Imam ((July 2007))

Upload: riyad-el-laithy

Post on 23-Jan-2015

3.063 views

Category:

Documents


0 download

DESCRIPTION

Intro to Commercial Unmanned Aerial Vehicles/Systems.Partial Free Code :)

TRANSCRIPT

Page 1: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 1

Arab Academy for Science and Technology and Maritime Transport

College of Engineering and Technology Department of Computer Engineering

UNMANNED AERIAL VEHICLE (UAV)

Presented by: Alexander Mohamed Osman Riyad Ahmed El-laithy Ruyyan Ahmed El-laithy Peter Raouf Zaky

Supervised by: Dr. Ibrahim Imam

((July 2007))

Page 2: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 2

ACKNOWLEDGEMENTS

After thanking God the Merciful we would like to send our thanks to the following

people:

Firstly we would like to thank Dr. Ibrahim Imam for proposing the idea of an

Unmanned Aerial Vehicle and for accepting us to carry on that project.

Secondly we would like to thank Dr. Atallah Hashad for giving us a helping hand

whenever we needed one and for providing us with solutions for all the challenges we

faced.

We would like to thank Dr. Hassan Ibrahim for providing us with help with the

electrical problems we faced in our circuits.

We would also like to thank Dr. Gamal Selim for his encouragement, assistance and

understanding.

We would like to thank Dr. Yasser Galal for answering some questions we had

about DC motors.

We would also like to thank Eng. Ahmed Akl, Eng. Renad Kamal, Muhab Bahgat,

Ruyhan El-Laithy, Fady Mounier, Beshoy Helmy, Todd Elliot, and Sparkfun Electronics

for supporting us and/or making this possible.

Last but not least we would like to thank our parents & families for their love,

support, and understanding.

Page 3: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 3

ABSTRACT

Gathering information from locations which are inhabitable, hostile, or difficult to

reach is a crucial aspect for learning new information about unmarked territories and

activities and aids in human technological advancement. This project is concerned with

developing an agent for gathering visual information by holding a stationary position or

pursuing a dynamic target. The agent is a quadrotor VTOL (Vertical Take Off and

Landing) aircraft. This agent should have the capability to hover, fly and follow targets. It

should receive and transmit data wirelessly into a base station. It should move through a

predefined plan using a GPS receiver. It should also balance itself in the air through a

gyrometer and an accelerometer. In addition it would utilize four ultrasonic sensors for

obstacle avoidance and an extra one for landing assistance. The agent would also utilize a

wireless camera to transmit a bird s eye view to the base station.

Page 4: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 4

TABLE OF CONTENTS

1. INTRODUCTION .......................7

2. CONCEPTUAL DESIGN & PHYSICAL ASSEMBLY .. 12

3. ANALYSIS, COMPONENT-LEVEL DESIGN & SELECTION .18

3.1 Major Components ..18

3.2 PCB Design .. .......25

3.2.1 Interface Boards ...27

3.2.1.1 GPS interface board .27

3.2.1.2 Accelerometer / Gyrometer interface board ................28

3.2.1.3 RF Interface boards 24-G .. ............28

3.2.2 Motor Driver 29

3.2.3 The Brain.. ...31

4. CONTROL 33

4.1 Introduction .........33

4.2 SPI communication .35

4.3 Main PIC Implementation ................38

4.3.1 Pulse Width Modulation (Motors) ...38

4.3.2 ADC Operation ............43

4.3.2.1 Ultrasonic Sensors 50

4.3.2.2 Gyrometer .. ...52

4.3.2.3 Accelerometer . ..52

4.4 Secondary PIC Implementation ......55

4.4.1 GPS System .55

4.4.2 RF Transceiver .66

4.5 RC Unit ......75

Page 5: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 5

5. TESTING TROUBLESHOOTING AND REDESIGN 78

5.1 Testing ..78

5.1.1 LED Testing ..78

5.1.1.1 Accelerometer Testing ..78

5.1.1.2 Gyrometer Testing 78

5.1.1.3 SPI Testing 79

5.1.1.4 RC unit testing ..................79

5.1.2 LCD Testing ..80

5.1.2.1 Ultrasonic testing . ..81

5.1.2.2 Accelerometer Testing . ..81

5.1.2.3 RC unit Testing . ................82

5.1.2.4 GPS Testing . .83

5.1.3 RF Testing . . .83

5.1.3.1 Ultrasonic Testing . 83

5.1.3.2 Gyro Testing . 83

5.1.3.3 RC Unit . 85

5.2 Previous Chassis designs . ...88

5.3 RF Drivers . .....90

5.3.1 Laipac RF TX/RX ...90

5.4 Configuration 1 ......92

5.5 Configuration 2 ..96

5.6 Brain #3 .....99

5.7 Correcting Gyro Output 100

6. FUTURE IMPLEMENTATIONS ..102

7. CONCLUSION .......103

Page 6: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 6

APPENDIX A : COMPONENT DATABASE AND CHARACTERISTICS . .104

APPENDIX B : CONTROL CODE . 106

APPENDIX C : WEIGHT & THRUST CHARTS .. . 165

APPENDIX D : LITHIUM POLYMER BATTERY CARE .167

APPENDIX E : ICSP PROGRAMMING .169

APPENDIX F : REFERENCES .170

APPENDIX G : BIBLIOGRAPHY ..173

Page 7: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 7

INTRODUCTION

The rapid development of micro-processor technology and the continuous growth of

integration density of electronical and mechatronical components yields a significant cost

reduction of high tech products. Driven by this development it becomes feasible to embed

information processing and communicating devices in all sorts of appliances, toys,

production facilities, communication systems, traffic and transport systems etc.

With this integration and the aid of global positioning systems, there has been a

surge of development in Unmanned Vehicles (UV). The main benefits of UV s are that

they do not require human control and thus can be reduced in size and cost. They also limit

human error in several aspects, and reduce if not eliminate human endangerment.

Unmanned vehicles are developed for use in air, over land and under water by both private

and government agencies. Several unmanned systems exist such as Autonomous

Underwater Vehicles (AUV), Unmanned Ground Vehicle (UGV), and Unmanned Combat

Vehicles (UCV). NASA deploys USVs (Unmanned Space Vehicles) on rock gathering

missions from the Moon and Mars. The military advanced UAVs and renamed them to

UAVS (Unmanned Aerial Vehicle Systems) and are used in flight combat.

Government search and rescue departments find the UAVs helpful in inhabitable or

hazardous terrain such as earthquakes, floods or volcanoes, where no human lives have to

be risked. Institutions which have onsite geologists use UAVs for uncovering terrain and

rock identification, without having to deploy a whole crew working outside. Departments

of transportation can use this device to cover footage of inaccessible situations such as

dead-lock traffic jams or multiple car-crashes. Government law enforcement and

intelligence agencies can specifically find this device useful for reconnaissance and target

pursuance, where the UAV provides the advantages of cheap costs, stealth and a

diminished human risk factor.

The Unmanned Aerial Vehicle project has been an ongoing attempt to produce a

reliable autonomous hovering or flying vehicle. The project designed and implemented a

four-rotor hovering aerial vehicle. The advantages of a hovering vehicle over a fixed-wing

Page 8: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 8

flying vehicle include less complexity in design, minimal space for take-off and landing

(vertical take-off and landing (VTOL)), indoor flight, maneuverability in obstacle heavy

environments and of course the eye-catching ability of being able to maintain a static

position in mid-air.

The advantage of quadrotors over helicopters is that they do not require mechanical

linkages to vary rotor angle of attack as they spin, this simplifies design and control. The

use of four rotors allows each individual rotor to have a smaller diameter than the

equivalent helicopter rotor, for a given vehicle size, allowing them to store less kinetic

energy during flight. These smaller propellers reduce the damage caused should the rotors

hit any objects, this also makes the vehicles safer to interact with in close proximity.

The first RC application of a 4-rotor vehicle was the Roswell Flyer made by Area51

technologies. Now there are several commercially available quadrotor aerial vehicles, to list

a few, Atair aerospace quadcopter , Hammacher Schlemmer four rotor UFO , Keyence

Engager and gyrosaucer

and the DraganFlyer V Ti . The team s design was inspired by

the DraganFlyer V, made by Draganfly Innovations Inc. where the four motors and props

are laid at the ends of an X Chassis, and in the center lay the majority of the circuit boards

and microprocessor dubbed by DraganFlyer Inc. as The Brain . (See figure below)

Page 9: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 9

System Block Diagram

A general control scheme can be seen in the diagram above. The controller block is

composed of two communicating MCU s (MicroController Units). The main MCU does

most of the calculations and decision making. The main MCU also receives inputs from the

proximity sensors and stability sensors, while the secondary MCU is responsible for

communicating with a GPS receiver for positioning and an RF module for wireless

communication. Both MCU s then drive the outputs for the four motors together.

The stability sensors block consists of a 3-axis Gyrometer for angular velocity

measurement and a 3-axis accelerometer for measuring acceleration. The proximity sensors

block consists of 5 ultrasonic sensors placed around the vehicle and under it, for obstacle

avoidance and assisted landing.

The GPS receiver block consists of a GPS module that provides position, velocity,

heading and altitude readings. The RF transceiver block consists of a 2.4GHz RF Module

that communicates bi-directionally with a remote control unit for sending and receiving

data.

Page 10: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 10

The Motor block consists of 4 high powered brushed motors with a gear ratio of

5.33:1 and 10x4.5 propellers. Both of these features provide a high thrust vehicle (As

opposed to high speed). These motors are controlled through switching transistor circuits

using PWM (Pulse Width Modulation).

The UAV works in three different modes, in the simplest mode a land based PC

sends out signals through an RF transceiver in order to steer the UAV in different

directions. In the second mode a land based PC receives images from an onboard camera,

then a pattern recognition system identifies a target object and sends signals to the UAV

through the RF transceiver to steer it toward the desired object. If the object is not found the

UAV rises in altitude quickly in order to find the object and re-track it. The third mode uses

an onboard GPS that gives the current position of the UAV and it compares that to its target

destination, and steers to its target destination then comes back to its initial point. In all

modes an accelerometer and gyrometer are used to provide stability, and ultrasonic sensors

are used to measure height and avoid obstacles and in turn to steer the UAV away from

them.

Because of the ambitious nature of the project, the team decided to build the UAV

from ground up. Development of our 4-rotor vehicle can be divided into four major

branches.

1. Conceptual Design and Physical Assembly.

2. Analysis, component-level design & selection.

3. Control.

4. Testing, Troubleshooting & Redesign.

Although these four stages overlapped and interfered with one another they can be

discussed independently, without much referencing to other sections.

Page 11: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 11

CONCEPTUAL DESIGN & PHYSICAL

ASSEMBLY

The conceptual design as stated previously was inspired by the DraganFlyer, and

the team s first step was to identify the design goals. These were the fundamental

requirements the team decided upon:

1. Ability to hover, in the sense of generating enough thrust and have enough

control in order to maintain a mid-air static position.

2. Maneuverability in all directions of a three-dimensional plane.

3. Sufficient endurance of no less than 10-15 minutes.

4. A very light-weight body, including a battery with the highest power to weight

ratio we could find since the battery is the heaviest single component of the

vehicle.

5. High residual thrust to hover thrust ratio, an acrobatic vehicle was desirable for

ability to demonstrate controllability and to perform difficult flight maneuvers.

6. Minimal size & complexity.

The team decided to stick very close to traditional designs of 4-rotor vehicles, where

four electric motors are placed on the corners of a rectangle, and drive four counter-rotating

propellers. These propellers would produce sufficient thrust for take-off, and according to

their different allocated power distributed on the four motors would provide

maneuverability. Any propeller spinning produces a torque on the body it is attached to. For

stability in flight the total resulting differential torque on the body should be zero. This is

demonstrated very clearly in helicopters. The main rotor on the roof of the helicopter

produces a large yaw torque on the body which is countered by the tail rotor on the rear of

the plane. Assuming the main rotor is on a constant rpm, the difference in power to the rear

propeller moves the helicopter around the z-axis.

Page 12: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 12

The proper rotation of the propellers, goes such as any two adjacent propellers

rotate in opposite directions, and any two diagonal propellers rotate in the same direction.

The sum of rotations of any two diagonal propellers should equal the sum of the remaining

two diagonal propellers. This makes the total differential torque on the body about the z-

axis zero. The figure below demonstrates the prop rotation direction.

At hover mode, all four propellers would be producing the same amount of torque

resulting in zero-net force on the vehicle about any-axis once gravity is taken into account.

To make the vehicle increase or decrease in altitude, the speed on all four propellers are

increased or decreased respectively. In order to move the vehicle in any direction of the x

or y axis, two propellers adjacent propellers are increased in thrust, this causes the vehicle

to pitch or roll in the desired direction, since the sum of the any two diagonal rotors is still

the same as their other diagonal pair, this prevents the vehicle from yawing in any direction

other than the desired course. Assuming the vehicle is in hover mode the following table

yields a summary of the vehicle control scheme. Use the previous figure for propeller

reference.

Page 13: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 13

Propeller 1 Propeller 2 Propeller 3 Propeller 4

Z+ (Up) + + + +

Z- (Down) - - - -

X+ (Left) + 0 0 +

X- (Right) 0 + + 0

Y+ (Forward) + + 0 0

Y- (Backward) 0 0 + +

As stated earlier, a lightweight body was a must in order to achieve maximum thrust

for ease of flight and acrobatic maneuvers. For the chassis of the plane carbon-fiber was

used, a very stiff and lightweight material, with a variety of practical uses commonly used

in racecars and RC planes for their unique characteristics. To save even more weight we

used the X-chassis design, where four motors would be placed on every end of the X-

chassis. This would also give a better chance for the high pressure to accumulate and

increase under the blade of the propellers to give higher lift than in a rectangular design. It

would also reduce the overall air resistance. The arms of the X-chassis were made from

hollow carbon-fiber tubes, and at the end of the tubes the motor mounts were placed. They

were welded together using a common adhesive known to the RC world as Epoxy .

On the bottom of the X-chassis the battery was mounted, keeping the battery on a

lower point would lower the center of gravity of the vehicle giving the vehicle smoother

pitching and rolling. On the four battery sides four ultrasonic sensors would be placed for

obstacle avoidance. On the bottom of the battery the fifth ultrasonic sensor was placed to

determine height, along with the wireless camera placed for surveillance purposes, video or

image capturing.

On the top of the X-chassis the UAV brain board was placed. It carries the

accelerometer, gyrometer, RF Transceiver, GPS, motor controllers, ultrasonic sensors

connections, and of course the Microcontrollers. The following figure below displays the

chassis.

Page 14: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 14

After going through the design and experimentation of three different prototypes

(found in 5.2 Previous Chassis designs). One of the most difficult tasks for us, that

absorbed most of our time was coming up with the chassis that can have completely

reduced air resistance, maximized technical output power when compared to theoretical

power of the DC Brushed Motors involved, uniform density, and as extremely lightweight

as possible with all the components that we have had to add on the UAV. The net weight on

the UAV including all added components added up 990g when measured on the scale,

which is almost 1 Kg. The theoretical output power given to us by the DC Brushed Motors

added to up to a maximum thrust of 390 grams per motor. (See APPENDIX C) Since we

have 4 motors on the UAV, the complete output power given by those motors is 1560

grams (1.56Kg). Technically, the team managed to output only around 350 grams per

motor, adding up to 1400 grams (1.40Kg) of thrust. The efficiency of our design brought us

89.74% of that power. The loss in power comes up to 10.26% due to friction forces, and

minimized air resistance.

It is made mostly out of lightweight Carbon Fiber and Balsa Wood for the base of

the electrical circuit. The total weight of the chassis without all the components comes to 43

grams. A CAD model was designed, shown in the following figures. An isometric view is

shown below, and the dimensions of the chassis design are shown in the next few pages.

Page 15: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 15

Top View:

Front View:

Right Side View:

Page 16: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 16

Calculations:

Motor Force:

Max OutputTheoretical/Ideal = 390 grams/Motor

Max OutputTechnical = 350 grams/Motor

Therefore, the Total Motor Output of 4 Motors at Full Power:

Max Output4Motors = 1400 grams/4 Motors

Maximum Payload = 1400 990 = 410 grams

Hence,

Max Output in Newtons = 1400 x 9.807 = 13.730 Newtons

Max Output per Motor = 13.730/4 = 3.432 Newtons

Net Force:

Therefore, Lift of Chassis at Full Power and when Differential Torque = 0.

Chassis mass = 990 grams = 0.99 Kg

Chassis weight = 0.99 Kg x 9.807 m/s2 = 9.709N

Lift = 13.730 9.709 = 4.021 Newtons

Acceleration:

Net Force = Lift - Gravity

= ma mg

4.021 = 13.730 9.709

0.99a = 1.4(9.807) 0.99(9.807)

a = (0.41(9.807)) / 0.99

acceleration = 4.061m/s2

Therefore, the Power to Weight Ratio: 1.5 : 1

Therefore, Lateral Thrust beyond Hover thrust = (4.061m/s2) / (9.807m/s2) = 0.4141g

Page 17: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 17

Torque:

= Acceleration / Distance to Center

= 4.061 m/s2 / 0.14m = 29.007 rad/sec2

= mass * radius2 * (angular velocity) = (0.495) x (0.14) 2 (29.007)

; where (0.99/2 Motors = 0.495 grams, since it takes 2 motors for the UAV to move front, back, left or right).

= 0.2814 Newtons

MAX = 4.061 x 0.14 = 0.56854 Newtons

A picture of the UAV with complete physical assembly can be seen below in the

following figure.

Page 18: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 18

ANALYSIS, COMPONENT-LEVEL DESIGN

& SELECTION

3.1 Major Components :

The selection of the motors were brushed motors the GWS EPS-350C with a

gearing ratio of 5.33:1, which peak out at 8.0V and 8.0A, each of these weigh 63g and are

projected to deliver 15.37oz (435.73g) of thrust at peak power. Four of these motors are

used, with one on each end of the X -chassis. A figure is placed below.

Counter-rotating propellers were selected as our default propellers, which are a must

in any quadrotor plane, because motors do not turn in the same direction. We selected

10*4.5 propellers which are large considered for our motor. Larger propellers are more

suitable for high thrust application, and smaller rotors are more suitable for high velocity

and aerodynamic capabilities. Our choice was the EPP1045 propeller. A figure of the

propeller is placed below.

Page 19: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 19

Heat syncs were also used to cool down the motors to increase durability and

efficiency as well as to dissipate the heat created by the motors for a longer, more durable

life. The team selected EHS300 an aluminum, multi-fin heat sync for good heat dissipation

and proper venting respectively. The heat sync has two large fins and 24 smaller fins. A

figure of the heat sync is placed below.

We needed a battery source that can provide more than 32A continuously,

considering each motor can consume 8A, the battery of choice was a Lithium-polymer

Thunder Power TP8000-2S4P two-cell 7.4V, 8AH battery. It can work continuously at 12C

(96A), and can burst at 18C (144A) which is more than sufficient to have all motors

working at full thrust. With a weight of 320 grams and dimensions of 128*50*29mm it had

a high power to weight ratio and size relative to its competitors. It would also give us about

a good 15 minutes of airtime if the UAV is flying at full power. A figure of the battery is

placed below.

Page 20: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 20

A compatible charger the Astro-flight 109D was selected. Charging rates from

50mA - 8A. Lithium polymer batteries can charge at a maximum of 1C of their rating, so

this charger can charge the battery in the fastest possible time which is 1 hour, for quick

practical testing. The battery is two cells, any battery with more than one cell requires a

balancer, so a blinky battery balancer was used which balances the cells before, after and

during recharge. A wattmeter was also required to measure the voltage and current of the

battery before and after recharge. A powerful and bulky power supply is required to

continuously deliver such current to the charger. The astro-flight power supply was used,

with an input of 110V/220V and an output of 13.5V, it delivers 12.5A. Figures of the

charger (top left), blinky battery balancer (top right), wattmeter (bottom left), and power

supply (bottom right) are placed below.

Page 21: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 21

The accelerometer used was the triple-axis ADXL-330. Works at 3.3V logic, and

consumes 0.32mA, it has three outputs for x, y and z axes. Minimum full scale range is

±3g, and a sensitivity of 300mV/g. The gyrometer used is the IDG-300 which also works at

3.0V logic and has a full scale range of 500°/sec, and consumes 9.5mA, but has only two

outputs, x and y. Because of this the team had to place two of these IC s onboard, to get

angular velocity about all three axes. Pictures of the accelerometer and gyrometer are

displayed below from left to right.

The IMU five degrees of freedom is an IMU (Inertia Measurement Unit) that

combines the IDG300 gyrometer and an ADXL330 accelerometer. This unit measures x

and y angular velocity and x, y, z accelerometer outputs, hence the name 5 degrees of

freedom . Its advantages over two separate units are firstly that the x and y outputs of both

have identical headings, and you only have one VCC and one GND connection.

Disadvantages are if this IC for any reason becomes defective you lose two IC s. A figure

of this IC is displayed below.

Page 22: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 22

Ultrasonic sensors used were the Max sonar LV-EZ1 which work at 5.0V logic and

have a maximum range of 255in (6.45m), which measures in increments of an inch, they

have analog, digital and pulse width modulated outputs. It consumes 2mA. Five of these are

placed onboard, four facing x and y axes, in order to detect obstacles around the vehicle,

and one on the bottom of the battery facing downwards to detect height and aid in landing.

We could not rely on the altitude reading of the GPS system for height because there is an

error tolerance of ±5m, this could result in hazardous landings. The extra ultrasonic sensor

on the bottom would virtually eliminate that error because its resolution is relatively quite

high.

For communication with ground, radio frequency IC s are used. The Laipac

TRF2.4-G transceiver was used. It operates at a high frequency, 2.4GHz. Data rate

transmission can work at either 250kbps or 1Mbps. It works at 3.0V logic consumes

10.5mA in TX mode and 18.5mA in RX mode. Maximum range is 280m. Each unit can

send and receive data interchangeably. One of the transceivers is placed onboard, and the

other is connected to a land-based PC, they send and receive data to and from each other.

Page 23: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 23

For unmanned guidance to different destinations a GPS system, the EM-406 was

used. Readings of latitude, longitude and altitude obtained serially are used to triangulate

the position of the IC. Power input is rated between 4.5V-6.5V and power consumption is

70mA, operating frequency is at 1.58GHz. A figure of the GPS is placed below.

jhnjh

For the surveillance system the WS-309AS system was used, the package comes

with 1.2GHz camera with a resolution of 628*582 and a horizontal definition of 380 lines.

The camera works at 9.0V, and consumes 85mA. A simple 9V battery operates the camera.

The package also comes with a receiver with audio out and video out. Linear transmission

distance ranges from 50m-100m. A picture of the camera and components are placed

below.

Page 24: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 24

The selected PIC programmer was the Olimex PIC-MCP-USB programmer. It is a

low cost PICSTART alternative, is MPLAB compatible and thus does not require a RS232

port. In addition it has an ICSP (In Circuit Serial Programming) connector (ICSP

programming explained in APPENDIX E). A figure of the programmer is displayed below.

Page 25: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 25

3.2 PCB Design

Required components for designing and etching a PCB are acetone, a laser printer,

glossy paper, a clothing iron, acid and a steel sponge. Firstly the surface of the brass board

is scrubbed with a steel sponge to remove any impurities and any oxidized brass. It is then

cleaned thoroughly with cotton drained in acetone. The team used the circuit designing

program called EAGLE 4.16r1 . Any circuit is printed on glossy paper, the printed glossy

paper is then well folded around the board to prevent any slip during ironing, then ironed

on the brass board. Ironing continues until the circuit becomes visible from the other side of

the printed glossy paper, or preferably when the white paper takes a yellowish/brownish

color indicating a slight burn. (Caution should be taken during ironing, if the brass board

becomes too hot, the brass actually deforms). After ironing, the paper should be removed

leaving the toner ink on the brass board. The brass board is then placed in the acid and left

until all brass surrounding the printed circuit is dissolved. After removing from acid and

rinsing in water, a steel sponge is gently scrubbed on the toner ink to leave the brass trace

under the toner ink while removing the ink. Holes are drilled into the circuit board in the

appropriate places where components are to be placed. After drilling is complete,

components are welded onto the board using solder and a soldering iron. All circuits used

for this project were designed in this manner. Pictures below (left to right) display this

procedure.

Before these boards were actually designed they were tested on bread boards first in

order to assure everything is working in order, because making an incorrect PCB means

much wasted time and raw materials. More of this can be referenced in Section 7, Testing

troubleshooting and redesign.

Page 26: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 26

Page 27: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 27

3.2.1 Interface Boards

Learning from previous errors we found it would be more convenient to create

interface boards for individual IC s rather than integrate them into one large circuit. (Much

the way a desktop motherboard uses PCI cards instead of making one large board.) This is

because if any errors occur in the design, or redesigning is desired, the individual IC s

wouldn t need to be removed. Frequently exposing IC s to strong heat when welding can

damage these components.

3.2.1.1 GPS Interface Board

In his board the GPS cable is welded onto the left row of pins. The descending order

of these pins is; not used, GND, TX, RX, VIN, & GND, again. The first pin is ignored. The

second and last pins (both GND) connect to the right side second pin. The third pin TX

connects to the fourth pin on the right. The 4th pin on the left is RX that connects to the

third pin on the right.

Page 28: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 28

3.2.1.2 Accelerometer / Gyrometer Interface Board

This follows the same method as the GPS interface board. The E$1 row is the yaw gyro,

E$2 row is the roll/pitch gyro. E$3 row is the three axis accelerometer. E$4 row is the pin

headers that connect onto the main board.

3.2.1.3 RF boards

The TRW-24G is a very sensitive component therefore we designed this interface board

with a TRW-24G socket for plug and play action onto the board.

Page 29: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 29

3.2.2 Motor Drivers :

Designing a suitable motor controller circuit was a challenging task, especially due to

the lack of components here in Egypt. The controlled motors could take up to 64 Ampere

bursts for a startup current and up to 8 Amperes as a continuous current. In order to achieve

maximum power we needed to cause a minimal voltage drop in our circuit. We came up

with the following design objectives:

- Switching speed of up to 2KHz (for PWM control)

- Minimum Vce drop possible for more powerful motors

- High current Ic

- Low current Ib

Unfortunately the transistors fitting this description could not be found here in

Egypt, but we found a transistor 2SD1062. It is capable of running a current of up to 15A

and Vce of as low as 0.3V, but it needed a larger current for Ib than a PIC could provide,

therefore we added a TIP120 transistor as an interface between the PIC and the 2SD1062.

Since Vce of the 2SD1062 was a function of the Ic current we put 2 transistors in parallel to

drop the Vce as low as possible while at the same time assuring that it has enough capacity

to pass through the required current for the motor.

A main feature of this circuit is the PC817 optocoupler, an IC that interfaces

between the PIC circuit and the motor circuit. Isolating these circuits was necessary

because combining high current components with low current ones can damage the low

current components. The optocoupler in the following diagram is labeled as 2. The left

side of the optocoupler is connected to the PIC circuit and the right side is connected to the

motor circuit. The first rows of pins in order are GND (PIC circuit), Vcc (PIC circuit), GND

(Motor circuit) and Vcc (Motor circuit). Vcc from PIC (PWM output) circuit goes through a

1.5K resistor through optocouplers where the phototransistor is activated and returns to

the PIC ground. The signal in turn goes through the base of the TIP120 turning it on. The

emitter of the TIP120 connects to the base of the 2SD1062 transistors, whose collectors are

Page 30: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 30

connected to the motor and the motor is connected to the Li-Poly battery. A circuit

schematic is shown below. Resistors were placed to produce desired voltage drops.

In the final motor driver design, the optocoupler was removed from the motor driver

and put on the main brain. This was done in order to have smaller motor drivers, and to

have less connections between the main board and the motor driver. Also large motor

drivers facing upwards would make contact with revolving propellers, and if facing

downwards could cause noise with the ultrasonic sensors.

Page 31: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 31

3.2.3 The Brain

To avoid the mistakes that occurred in Configuration 2 mentioned in the Testing,

Troubleshooting & redesign section the team changed two things mainly. FirstlyTo avoid

the problem of circuit design or re-altering, it was decided that the IC s would be mounted

on separate boards that would mount on the main Brain board, much the way PCI slots

are mounted on a normal PC. In our previous design, should any circuit design errors occur,

a new board would have to be made, and all components would have to be welded off the

old board, and re-welded to the new brain. This takes a lot of time, and it is also potentially

damaging to the components to be frequently exposed to the welder. Secondly as for having

the problem of high power rated components alongside low power rated ones in one circuit,

optocouplers were used to interface between the Brain board and motor drivers, this is

more thoroughly explained in the previous section 4.6 Motor Drivers .

Page 32: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 32

This Main board was designed to accommodate two PIC16LF777s, 4 Motor

controller boards connected through 4 opto-couplers, a 3-axis accelerometer, 2 dual-axis

gyrometers, 5 ultrasonic sensors, a GPS receiver and a RF transceiver. To keep the circuit

as small as possible we used the internal 8MHz oscillators available in PIC16LF777 PICs

instead of adding more components to the circuit in the form of crystals and capacitors. The

circuit is powered by a 9V battery and has a 5V regulator as well as a 3V regulator for all

5V Logic components as well as the 3V Logic components to operate. We also added some

LEDs to simplify debugging. Later on we manually welded on some wires to two ICSP

connectors to program the two PICs without removing them from the circuit. (As seen in

the previous picture).

Page 33: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 33

CONTROL

4.1 Introduction

The Main PIC is responsible for reading and calculating the orientation of the plane,

and accordingly take a decision. The Main PIC has only 3 PWM modules, therefore we use

an extra PWM from the Secondary PIC. The Main PIC sends commands to the Secondary

PIC to increase or decrease the power of one PWM output, it also sends the orientation data

to be sent through the RF to the base computer station. The Secondary PIC takes the GPS

messages and extracts the required values and sends them to the Main PIC, as well as

through the RF to the base station. Regarding the control scheme, there are four separate

operation modes:

1. Hover Mode

2. RC Mode

3. GPS Mode

4. Tracking Mode

In Hover Mode:

Tries to keep the vehicle stable in position. The following pseudocode demonstrates

the operating algorithm.

Start up system Read bias values from IMU sensors Loop:

Read sensors Calculate Angles & Height If(Height<Required Meters)

Increase PWM if(Height>Required Meters)

Decrease PWM if tilted left

Tilt right If tilted right

Tilt left If tilted forwards

Tilt backwards If tilted backwards

Tilt forwards Repeat loop

Page 34: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 34

In RC Mode:

The Secondary PIC is the one that receives the RC commands through the RF, then

forwards them to the Main PIC to execute.

In GPS Mode:

The Secondary PIC takes the GPS messages and extracts the required values and

sends it to the Main PIC, and it sends all other useful data through the RF to the base

station. The Main PIC takes decisions according to its coordinates achieved from the GPS

from the Secondary PIC.

In Tracking Mode:

The base station receives the Video Feed from the Wireless Camera on board the

vehicle and searches for a blue target in view, if it is not found the vehicle will gain altitude

and search again. Once a target is found the plane will descend quickly and hover above the

target and keep following it. The Secondary PIC receives the commands from the base

station through RF and forwards the commands to the Main PIC which performs the

required actions.

Page 35: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 35

4.2 SPI communication SPI communication enables quick communication between two PIC s. One is set as

a Master PIC and the other as a slave. Originally one PIC was intended to be used, but

failed. (refer to Testing, Troubleshooting & Design : Configuration 2). The connection is as

follows on the diagram below. The left block represents the Master PIC and the left block is

the slave. A bit is released from the Master SSPSR to SD0, and the slave PIC releases a bit

through it s SD0 also. The clocks SCK of both PICS are connected together. When a clock

pulse rises and falls from the master PIC a bit is transferred. Every consecutive clock

transfers a bit. Once the shift registers reach 8-bits (1 byte) the byte is transferred to the

serial input buffer and the shift register is ready to receive data again. Three connections are

required, CLK to CLK (C3-C3), Master data out to slave data in (C5 C4), and master data

in to slave data out (C4 C5).

Two registers must be set in both PIC s in order to enable this mode; SSPSTAT and

SSPCON. (Actual settings for these registers can be found in APPENDIX B : CONTROL

CODE)

Page 36: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 36

SSPSTAT (Status Register)

Page 37: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 37

SSPSCON (MSSP Control Register)

For desired interrupts bits 6 and 7 of INTCON (Global and peripheral interrupts)

should be set. Bit7 of PIE1(SSPIE) should be set. When interrupt occurs bit7 of

PIR1(SSPIR) is set. This occurs if either a byte is successfully transferred, also in case of

collision occurs or overflow occurs.

Page 38: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 38

4.3 Main PIC Implementation

Generally as aforementioned, this PIC uses PWM, SPI, and ADC, it decides the

orientation and heading of the plane. The following sections divide these tasks and explain

each of these elements independently.

4.3.1 Pulse Width Modulation

After we have finally tested all our sensors, GPS device and RF devices for correct

processed data, we can now begin to implement the results as output on the propellers

through motor control. This is achieved by the use of PWM. In the PIC 16LF777, it has

three pins for PWM. The control registers used to enable PWM on this PIC are CCP1CON,

CCP2CON, CCP3CON, PR2 and most importantly T2CON, since PWM is controlled by

Timer 2 in the microcontroller. These three CCPXCON registers let us enable capture

modes, compare modes or PWM. Of course here, we will enable the PWM.

Page 39: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 39

Bit 7: Unimplemented.

Bit 6: Unimplemented.

Bit 5: Should be set as 0. Second Least Significant bit in PWM mode. (10-bit Resolution).

Bit 4: Should be set as 0. First Least Significant bit in PWM mode. (10-bit Resolution).

Bit 3: Should be set as 1. (To enable PWM mode).

Bit 2: Should be set as 1. (To enable PWM mode).

Bit 1: Don t care in PWM. (To enable PWM mode).

Bit 0: Don t care in PWM. (To enable PWM mode).

The CCPXCON registers will be all set as following:

CCP1CON: 0x0F = 0b00001111;

CCP2CON: 0x0F = 0b00001111;

CCP3CON: 0x0F = 0b00001111;

Page 40: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 40

After setting the CCPXCON registers, we must now set the T2CON register where

most importantly we must enable TIMER2 of the microcontroller and then set the period

we need to control our DC Brushed Motors in an optimum way using the PR2 register and

setting it with a fixed value. By means of research and supervision, it was decided to

control our motors at a frequency of 750Hz (750 times per second).

For T2CON, we place the following settings:

After setting the CCPXCON registers, we need to now set the T2CON register which

enables TIMER2 in the microcontroller that will then control over the frequency or period

we need on the Pulse Width Modulation. In order do this we must set the following bits as

follows.

Bit 7: Unimplemented.

Bit 6: Should be set as 0. (Postscaling will not be needed).

Bit 5: Should be set as 0. (Postscaling will not be needed).

Bit 4: Should be set as 0. (Postscaling will not be needed).

Bit 3: Should be set as 0. (Postscaling will not be needed).

Bit 2: Should be set as 1 in order to enable and turn on Timer 2.

Bit 1: Should be set as 1. (Since prescale with a value of 16 is required).

Bit 0: Should be set as 1. (Since prescale with a value of 16 is required).

Page 41: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 41

Our goal to control our motors at around 750Hz. Now since the microcontroller can

execute 2 million instructions per second (500 nanoseconds). Speed should be reduced by

prescaling. When you prescale your instructions per second over 16 which is our

maximum, then we have reduced the frequency to 125 KHz (125000Hz). This is where the

PR2 register comes in handy to further reduce frequency to 750Hz.

For PR2, we place the following settings:

PR2 is an 8-bit register made available in order to control the frequency output

needed on the DC Brushed Motors. After using the T2CON register for prescaling to

reduce frequency to 125 KHz, PR2 register is used to enter a decimal value that will control

and limit our frequency to 750Hz. The value to be placed in the PR2 register is calculated

as follows. We divide the 125000 Hz obtained by 750Hz which is what is needed.

125000/750 = 166.666667. Since the value to be placed in the PR2 register should be an

integer value and is an 8-bit register and carries no space for a floating point number, 167

should be entered after subtracting 1 from it.

Therefore,

PR2 = 166

The equation for PR2 is: round (Fosc / (4 x 16 x Period Required)) - 1

Hence,

Fosc = 8 x 10^6

PR2 = round(8 x10^6 / ( 4 x 16 x 750)) - 1

PR2 = round(8 x 10^6/ (48000)) - 1

PR2 = round(166.66666667)) - 1

PR2 = 167 - 1

PR2 = 166

Page 42: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 42

Setting outputs on the Tri-State Buffers on all ports of the Microcontroller:

Since the PWM pins are driving the motors they need to be se as output pins. This is

done by setting the registers TRISB and TRISC.

TRISC = 0x00 Hex = 0b00000000.

TRISB = 0x00 Hex = 0b00000000.

The diagram of the PIC 16LF777 can be used as a reference below for the output pins

CCP1 on Port C2, CCP2 on Port C1, and CCP3 on Port B5.

*NOTE: Please see APPENDIX B for the sample code of Pulse Width Modulation and how

to control it.

Page 43: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 43

4.3.2 ADC Operation

Here using the Analog - to - Digital converters is most crucial in order to automate

our Unmanned Aerial Vehicle (UAV). For the most part, most or all of our sensors,

ultrasonic, gyrometer and accelerometer give us feedback on our control system. The

Ultrasonic provides us with a way for collision detection and obstacle avoidance. The

accelerometer and gyrometer provide us with crucial data to help us stabilize our UAV in

mid-air and maintain a static hovering position. It can also help the UAV to auto-level after

traveling in a certain direction, like a co-pilot.

The outputs of those sensors are analog voltages. The Analog - to - digital converter

here helps with converting those outputs into useful data ready to be used and processed by

the microcontroller. In this project we use the 16LF777 PIC by Microchip. It contains an

abundant 14 channel 10-bit ADC.

We have 11 inputs from those sensors. Five alone for the ultrasonic sensors, placed on

the front, back, left, right, and bottom sides of our UAV for height accuracy. The

ultrasonic s range is far as 6.45m (254 inches) and as small as 15cm (6 inches) to aid the

UAV in landing due to its blind spot. Six channels are used for 2 Gyrometers and an

accelerometer. Each gyrometer outputs the rate of angular velocity in the X and Y planes,

so we need three channels since we have 2 gyrometers. One input/channel will be ignored

from the second gyrometer. The accelerometer needs 3 channels since it measures

acceleration in the X, Y, and Z directions. This makes a total of 11 channels. Therefore, 3

channels on our 16LF777 microcontroller will not be used out of the 14 channels.

In order to set this up in our PIC we must enable certain bits in our control registers of

the 16LF777 microchip. These control registers are the ADCON0, ADCON1, ADCON2,

PIE1, and PIR1 and last but not least the INTCON register to enable our interrupts

especially when the ADIF (AD Interrupt Flag) is set after every conversion in the PIR

register.

The result of the Analog-to-Digital Converter is placed in the ADRES (AD Result)

register. It consists of 2 8-bit registers, ADRESL (AD Result LOW) and ADRESH (AD

Result HIGH).

Page 44: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 44

Page 45: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 45

Page 46: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 46

For ADCON0, we place the following settings:

Bit 7: <ADCS1> Must be set as 1 since we are using the Internal Oscillator.

Bit 6: <ADCS1> Must be set as 1 since we are using the Internal Oscillator.

Bit 5: <CHS2> Analog Channel Select bit.

Bit 4: <CHS1> Analog Channel Select bit.

Bit 3: <CHS0> Analog Channel Select bit.

Bit 2: <GO/DONE> A bit that controls the start of conversion or end of conversion.

Bit 1: <CHS3> Analog Channel Select bit.

Bit 0: <ADON> Turns on the ADC module in the microcontroller.

Bits 5,4,3,1 are used to select the channels we need to take our inputs from. Therefore, you

need to toggle through them as we read our values over the output interval time. We start

out by reading through channel 0, then 1, then 2, until we reach channel 10 (11 Channels)

then go back to Channel 0 to take new readings to process for our new interval.

Page 47: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 47

For ADCON1, we place the following settings:

Bit 7: <ADFM> Must be set as 1 for Right Justification in the ADRES

register. In reading our result from the ADRES register,

we read all the 8 bits from ADRESL and the least significant bits

of ADRESH and multiply it by 256.

Bit 6: <ADCS2> Must be set as 1 since we are using the Internal Oscillator.

Bit 5: <VCFG1> Must be set as 0 since our Vref+ is normally the VDD of the PIC.

Bit 4: <VCFG0> Must be set as 0 since our Vref- is normally the VDD of the PIC.

Bit 3: <PCFG3> Must be set as 0 since we need to enable 11 Channels.

Bit 2: <PCFG2> Must be set as 1 since we need to enable 11 Channels.

Bit 1: <PCFG1> Must be set as 0 since we need to enable 11 Channels.

Bit 0: <PCFG0> Must be set as 0 since we need to enable 11 Channels.

The bits 3,2,1,0 of PCFG(X) remain fixed since we are enabling only 11 Channels for

the ADC to read from. The pins where pins AN11, AN12 and AN13 of the microcontroller

16LF777 remain digital I/O pins depending on the settings of the Tri-State Buffers for the

ports.

For ADCON2, we place the following settings:

Bit 7: Unimplemented.

Bit 6: Unimplemented.

Bit 5: Must be set as 1, since we wish the conversion to take 12TAD

(24 sec).

Bit 4: Must be set as 0, since we wish the conversion to take 12TAD (24 sec).

Bit 3: Must be set as 1, since we wish the conversion to take 12TAD (24 sec).

Bit 2: Unimplemented.

Bit 1: Unimplemented.

Bit 0: Unimplemented.

Page 48: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 48

The reason why 12TAD is necessary here is simply because one TAD is equivalent to

2 sec. The acquisition time must not exceed the minimum of 19.72 s which is how long

the ADC before the ADC starts conversion automatically.

Therefore, 2 s * 12 = 24 sec, which is how long the ADC needs to acquire our data

from one input channel.

In order to keep the microcontroller working efficiently and processing data without

having it constantly polling and wasting processing power on all kinds of data coming in

through the Sensors, GPS device or RF transceivers, we use interrupts. Concerning our

sensors we set the PIE1 control register in our microcontroller. The Analog-to-Digital

Interrupt Enable (ADIE) is bit number 6. We set it to 1. Whenever the ADC finishes a

conversion, it will set the Analog-to-Digital Interrupt Flag in (ADIF) to 1 in register PIR1,

interrupting the PIC. After we take our reading for the ADC, we must clear the ADIF in the

PIR1 register in our software or else the PIC will keep itself running in a loop. Then we

must change our channel through the bits 5, 4, 3, and 1 in the ADCON0 register. When this

is done, we start a new conversion by the setting the bit number 2 (GO/DONE) as 1 in the

ADCON0 register until the end of conversion is complete and the ADIF is set again calling

the interrupt function in our microcontroller.

Setting our inputs on the Tri-State Buffers on all ports of the Microcontroller:

Since we have already set our control registers of the ADC module most importantly,

we need to set the tri-state buffers on our ports in order to receive our inputs from the

sensors. This is done by setting the registers TRISA, TRISB, and TRISE.

TRISA = 0xFF Hex = 0b11111111.

TRISB = 0x0E Hex = 0b00001110.

TRISE = 0x07 Hex = 0b00000111.

Page 49: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 49

In the summary of registers shown above, we must be very careful when setting the

TRISE register because only the three least significant bits here control the PORTE Data

Direction Bus, unlike TRISA where the complete register is used for only 6 pins. If we set

the TRISE = 0xFF, it will cause the PIC to set two interrupt flags IBF and OBF and

enable PSP Mode , which will cause PORTD to engage in parallel communication. This

will cause the PIC to enter in an infinite loop of interrupts and if the flags are not cleared in

the software. It almost causes the microcontroller to seem to Halt in a sense.

Page 50: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 50

4.3.2.1 Ultrasonic Sensors

The ultrasonic sensors used on the UAV can detect up to 254 inches 6.45 (meters) and

the minimum distance it can detect due to its blind spot is 6 inches (15 cm). The sensor

generates a new reading every 49 milliseconds. Since the microcontroller can take readings

much faster than the ultrasonic sensor s output, if we take the readings at that speed, it will

cause a lot of noise in our program for the UAV, so it is best we take our readings every

49 milliseconds to avoid the noise and make sure we have a new reading every time to be

put to good use.

Every 0.01 Volts on our Ultrasonic sensor represents 1 inch of distance. Therefore, if

the voltage on the output pin of the ultrasonic sensor is 0.20 Volts, then the distance it reads

is 20 inches, therefore it is very simple to use.

In order to calculate the distance we need in our PIC 16LF777 we use a very simple

equation which is:

Distance (in Hexadecimal) = (Vin/Vref) X (2N) ;

where Vin : is the Voltage input coming from the Ultrasonic Sensor.

Vref : is the reference voltage from our circuit which is 3.30V

N : is the number of bits of the ADC which is 10, therefore is

1024

For example,

If Vin = 0.50V (which is equivalent to 50 inches read).

Vref = 3.30V

Then, 0.50/3.30 X 1024 = 155.1515 Hexadecimal

In the ADC of the PIC 16LF777, the ADRES (AD Result) register will read 155 and

will truncate the 0.1515.

If we take the reading 155 from the ADC and try to convert it back, it will be as

follows:

Page 51: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 51

Vin = (Reading from ADRES Register in HEX / 2N) X Vref

Vin = (155/1024) X 3.30V = 0.4995 Volts.

Therefore the error is: (1 (0.4995/0.5)) X 100 = 0.1 %

which is quite accurate.

*NOTE: Please see APPENDIX B for the sample code of the Ultrasonic Sensors.

Page 52: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 52

4.3.2.2 Gyrometer

The gyrometer used was the IDG300. This IC gives accurate readings of angular velocity.

All three angles were needed for control of the UAV, on the x, y and z axes; traditionally in

flight labeled as roll, pitch and yaw angles. Angular velocity is measured accurately with a

sensitivity of 2 mV/ º/s. So every degree of rotation would indicate 0.002V electronically.

The first thing to do was to interpret the signals into degrees, 0º - 360º.

This IC operates so that if the IC is rotated suddenly then stopped, you would get a

change in reading only when the IC is moving, only when there is angular velocity. Thus an

adder function is needed to constantly integrate the tilt intervally through the selected

frequency, as general equation is as follows:

SUM SUM newt

Where SUM is initially set to 0. new is the latest reading from the gyro output and T is the

sampling period.

After the electric signal would be received on the ADC ports of the PIC it would be

multiplied by the following equation to give degrees:

1024* *

3.3 0.62New Old

tAngle Angle Vin

Also any negative value for tilt had 360 added to it, since simple sin and cos

functions behave differently to negative values.

4.3.2.3 Accelerometer

The accelerometer used was the ADXL330. This gives accurate measures of

acceleration about all three axes. Typical sensitivity of this IC is 300mV/g, so every 1m/s2

of acceleration would indicate 30.58mV electronically. Primarily this IC has two main

functions. The first is to indicate the initial angles of x and y in reference to the xy plane

perpendicular to the gravity vector, so that the UAV can take off from any angled surface,

if an accelerometer was not used, the system would always assume that the plane it was

taking off from was always perpendicular to the vector of gravity, causing flight to be

unstable. To use the accelerometer as an inclinometer, assuming X and Y are the

acceleration values obtained from the corresponding axes on the accelerometer then, simply

Page 53: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 53

X=sin-1X

g

Y=sin-1

Y

g

The second use is to produce accurate estimations of acceleration, velocity and

position, for use in the simulation. A fixed reference point is taken, more accurately the

fixed axes at the point of takeoff. Acceleration and velocity in reference to that point are

calculated. Distance from that point is calculated, and distance traveled around that point is

also calculated. Considering the accelerometer uses the angles supplied from the gyrometer,

a traditional 3D rotational matrix is used to rotate the constantly generated acceleration

vectors around the reference axes, so that every value from the accelerometer has a X, Y

and Z component on the reference axes.

Rotation around the x-axis is defined as :

RX( X) =

1 0 0

0 cos sin

0 sin cosX X

X X

where X is the roll angle

Rotation around the y-axis is defined as :

RY( Y) =

cos 0 sin

0 1 0

sin 0 cos

Y Y

Y Y

where Y is the pitch angle

Rotation around the z-axis is defined as :

RZ( Z) =

cos sin 0

sin cos 0

0 0 1

Z Z

Z Z

where Z is the pitch angle

Multiplying all these matrices together would give the following matrix:

Page 54: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 54

1

cos cos cos sin sin

sin sin cos cos sin sin sin sin cos cos sin cos

sin cos cos sin sin sin cos sin sin cos cos cos

Y Z Y Z Y

Y X Z X Z Y X Z X Z X Y

Y X Z X Z Y X Z X Z X Y

A

if X,Y and Z are the acceleration values obtained from the corresponding axes on the

accelerometer then,

ReferenceX = Xcos Xcos Y + Y(sin Ycos Xsin Z-sin Xcos Z) +

Z(sin Ycos Xcos Z+sin Xsin Z)

ReferenceY = Xsin Xcos Y + Y(sin Ysin Xsin Z+cos Xcos Z) +

Z(sin Ysin Xcos Z-cos Xsin Z)

ReferenceZ = - Xsin Y + Ycos Ysin Z + Zcos Ycos Z

Integrating with respect to time once gives velocity, and integrating twice gives

position. Adder functions are used for velocity and position for each reference axes.

Another adder function is created taking the absolute value of every acceleration reading,

then multiplying them by time twice in order to calculate the distance traveled. All adder

functions for total rigid body acceleration, velocity, distance from origin and distance

traveled, this simple equation is used.

2 2 2Value X Y Z

Page 55: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 55

4.4 Secondary PIC Implementation

Generally as aforementioned, this PIC uses PWM, SPI, USART, and communicates

with an RF module. It handles communication tasks for the Main PIC. It also acts as a

secondary PWM module. The following sections divide these tasks and explain each of

these elements independently.

4.4.1 GPS System

GPS has become a widely used aid to navigation worldwide, and a useful tool for

map-making, land surveying, commerce, and scientific uses. GPS also provides a precise

time reference used in many applications including scientific study of earthquakes, and

synchronization of telecommunications networks. There is a constellation of 30 (earth

orbiting satellites as of April 2007) that transmit precise radio signals. Their orbits are set

up so that at any given point and time on the earth s surface there are at least six of these

satellites in reach. A figure below demonstrates the constellation of NAVSTAR GPS

satellites.

Page 56: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 56

A GPS receiver calculates its position by measuring the distance between itself and

three or more GPS satellites, using trilateration. Measuring the time delay between

transmission and reception of each GPS radio signal gives the distance to each satellite,

since the signal travels at a known speed. The signals also carry information about the

satellites' location. By determining the position of, and distance to, at least three satellites,

the receiver can compute its position using trilateration. Receivers typically do not have

perfectly accurate clocks and therefore track one or more additional satellites to correct the

receiver's clock error.

The figures below briefly explain trilateration, where at the center of each sphere

there is a satellite. When two spheres intersect they create lines. When the third sphere

intersects it creates a point revealing the location of the receiver.

The coordinates are calculated according to the World Geodetic System WGS84

coordinate system. Position is determined by latitude and longitude which are basically

angles, latitude ranges from 0-90 north and south, and longitude ranges from 0-180 west

and east. The figures below display latitude and longitude.

Page 57: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 57

To calculate its position, a receiver needs to know the precise time. The satellites

are equipped with extremely accurate atomic clocks, and the receiver uses an internal

crystal oscillator-based clock that is continually updated using the signals from the

satellites.

GPS satellites continuously transmit almanac and ephemeris at 50bps. The almanac

consists of coarse time information and orbital data (speed and path). The ephemeris gives

the satellites precise orbit. The almanac assists in the acquisition of other satellites. A

complete almanac transmission is a 37,500 bit navigation message that takes 12.5 minutes

to download. This long delay occurs when a new receiver is first turned on. Each satellite

transmits its navigation message with at least two distinct spread spectrum codes: the

Coarse / Acquisition (C/A) code, which is freely available to the public, and the Precise (P)

code, which is usually encrypted and reserved for military applications. The C/A code is a

1,023 bit long pseudo-random code broadcast at 1.023 MHz, repeating every millisecond.

Each satellite sends a distinct C/A code, which allows it to be uniquely identified.

Page 58: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 58

The receiver identifies each satellite's signal by its distinct C/A code pattern, then

measures the time delay for each satellite. To do this, the receiver produces an identical

C/A sequence using the same seed number as the satellite (two or more systems using

matching seeds can generate matching sequences of non-repeating numbers which can be

used to synchronize remote systems). By lining up the two sequences, the receiver can

measure the delay and calculate the distance to the satellite, called the pseudorange. The

pseudoranges are then the time the signal has taken from there to the receiver, multiplied by

the speed of light. The orbital position data from the Navigation Message is then used to

calculate the satellite's precise position. Knowing the position and the distance of a satellite

indicates that the receiver is located somewhere on the surface of an imaginary sphere

centered on that satellite and whose radius is the distance to it. When four satellites are

measured simultaneously, the intersection of the four imaginary spheres reveals the location

of the receiver. The orbital position data from the Navigation Message is then used to

calculate the satellite's precise position. Knowing the position and the distance of a satellite

indicates that the receiver is located somewhere on the surface of an imaginary sphere

centered on that satellite and whose radius is the distance to it. When four satellites are

measured simultaneously, the intersections of all four imaginary spheres reveal the location

of the receiver.

Often, these spheres will overlap slightly instead of meeting at one point. The

receiver then moves the overlapping pseudoranges with the same amount (regardless of

distance of receiver to satellite) till an intersection point is created this point is usually the

most probable position. This scenario is shown in the following figure.

Page 59: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 59

An overlapping pseudorange occurs here. Instead of having one intersection point, a

room is created by all three points of B . All distances are subtracted by the same amount,

in this case 0.5, in order to receive an intersection point at A . Point A is considered the

most probable point of the receiver.

Regarding GPS time as opposed to the conventional second, minute and hour; you

only have seconds, more precisely seconds of the week. In a normal clock when the

seconds reach 60 it starts a new minute. In GPS time when the seconds reach 604,800 it

starts a new week, this is calculated by 7(days)*24(hours)*60(minutes)*60(seconds).

As for GPS date as opposed to the year, month, and day format of the Julian

calendar, the GPS date is expressed as a week number and a day-of-week number. The

week number is transmitted as a ten-bit field, and so it becomes zero again every 1,024

weeks (19.6 years). GPS week zero started at (00:00:19 TAI) on January 6, 1980 and the

week number became zero again for the first time at on August 21, 1999. This event is

known as a rollover.

After a GPS does a full almanac download, GPS systems boot in 3 different modes.

Those would be cold start, warm start and hot start. In cold start, time and position are

known within some limits, the almanac is known and the ephemeris is unknown. In warm

start, time and position are known within some limits, the almanac is known, and at least

three satellite ephemeris are known from the previous operation. In a hot start all ephemeris

for all satellites are known so a hot start occurs. The GPS receiver chooses how to start

based on the time between last turn off and current turn on. If this time was a few minutes

the GPS chooses hot start which takes 1 second, if it was a few hours the choice is warm

start which takes 38 seconds, anything longer than that produces a cold start which takes 42

seconds.

Most GPS systems have two protocols SirF protocol and NMEA protocol. In our

case the NMEA protocol was used. NMEA protocol simply contains input messages and

output messages. (Refer to the NMEA reference manual)

Page 60: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 60

Input messages selected to initialize the GPS are:

$PSRF100,1,4800,8,1,0*0E\r\n

$PSRF103,04,00,02,01*22\r\n

$PSRF105,0*3F\r\n

$PSRF is used for input messages. The star means the following two characters are

checksum, NMEA checksum operates by 16-bit XOR a checksum calculator code is shown

in the APPENDIX B : CONTROL CODE, and /r/n represent carriage return and line feed,

whose HEX code are 0D 0A. All other fields in between them are data fields for different

settings.

$PSRF100,1,4800,8,1,0*0E\r\n

This message was used for setting the serial port. 100 in the first field represents serial port

settings. 1 in the second field is for NMEA protocol, 4800 is for baud rate, 8 is for 8 data

bits, 1 is for 1 stop bit, and 0 is for no parity bit.

$PSRF103,04,00,02,01*22\r\n

This line is used for enabling and disabling output messages, 103 is used for query/control

mode. 04 is used for RMC mode, 02 is used for releasing the message at 2Hz, 01 is used for

enabling checksum.

$PSRF105,0*3F\r\n

105 is used for development data. The 0 represents debug off should any error occur, so

that our PIC does not receive any unnecessary input. When a GPS is turned off, it s last

settings before being switched off will be saved in it s battery powered RAM. When turned

on, these settings resume. These input messages were considered necessary in order to set

the serial port correctly for USART communication, RMC mode was chosen because this

one single message had all the necessary information required. The third message is for

turning off debug to avoid unnecessary input to the MCU.

A 16-bit XOR CRC creator was necessary to give input messages. A JAVA code is

displayed in the APPENDIX B: CONTROL CODE.

Page 61: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 61

Later on a program called SiRF Demo PC GPS Utility v3.83 was found very helpful

for obtaining latitude and longitude coordinates for our tested range area. It can also be

used as an initialization alternative. To initialize your GPS time, you simply click setup

then click GPS Time

PC Time as shown in the figure below. Usually the demo starts

in SiRF protocol. To switch it to NMEA protocol you simply click action then Switch to

NMEA Protocol , to open NMEA Setup. In this window as shown in the figure below, you

can select each message and it s frequency per second. Highlighting checksum is preferred

for message validation. For NMEA, baud rate should be set at 4800bps. After powering off

the GPS receiver, GPS time, message type and frequency are saved.

Page 62: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 62

Output messages received from RMC mode (in order) are UTC time, data validity,

latitude, north/south indicator, longitude, west/east indicator, velocity over ground in knots,

heading measured clockwise from north in degrees, and date A sample output message is

shown below:

$GPRMC,161229.487,A,3723.2475,N,12158.3416,W,0.13,309.62,120507, ,*10

The first two letters following the $ represent the device in use. The GP stands for GPS.

There are other devices such as:

LC Loran-C

TR Transit SATNAV

AP Autopilot (magnetic)

HC Magnetic heading compass

RA Radar

SD Depth sounder

VW Mechanical speed log

Latitude and longitude are displayed in degrees and minutes, At a latitude of 30° N

(Cairo, Egypt), the latitude minute = 1847.54m and longitude minute = 1608.1m (distances

change because the circumference of parallel of latitude changes, Earth is not a cylinder,

please refer to http://home.online.no/~sigurdhu/Grid_1deg.htm

), velocity is multiplied by

1.852 to change from knots to km/hr. Then course heading in degrees ranging from 0°-

360° moving clockwise from north. The final field before the checksum is date. The only

fields needed were data validity, latitude, longitude, velocity and heading. VTG mode was

desired to attain height, but during testing, height in MSL (Mean Sea Level) was quite

inaccurate. At a change of height of about 4 meters, the GPS detected a change of height of

10 meters which is an error of over 150%. Latitude, longitude velocity and heading are

transmitted via RF to the simulation.

Page 63: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 63

A destination in GPS mode is set by pre-inputting a target destination, in the PIC

program, in latitude and longitude. The following steps are taken:

1. Y = Target Latitude Present Altitude

2. X = Target longitude Present Latitude

3. Distance = 2 2X Y

4. TempAngle is obtained by 1tan

Y

X

Desired course heading is obtained by the following scheme:

Y X Course

+ + TempAngle + 0°

- - TempAngle + 180°

+ - TempAngle + 360° (TempAngle is negative)

- + TempAngle + 180° (TempAngle is negative)

Resgister Settings

Communication between the PIC and GPS system is acheived by the Universal

Synchronous Asynchronous Receiver Transmitter (USART). In this case Asynchronous

mode is used. (refer to the PIC 16F777 pdf file, section 11.0 for more detailed information)

To enable this serial mode three registers must be set; TXSTA, RCSTA and SPBRG.

TXSTA is set in the following manner:

Bit 7: 0 Don t care (for Asynchrous mdoe)

Bit 6: 0 for 8-bit transmission

Bit 5: 0 for transmission enabled

Bit 4: 0 for Asynchronous mode

Bit 3: 0 this bit is unimplemented

Bit 2: 0 for High speed

Bit 1: 1 for TSR empty (TRMT)

Bit 0: 0 not used in 8-bit transmission

Page 64: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 64

SPBRG is the simplest where only a value is entered into the register. Considering

asynchronous mode is used and the system is low speed, the following equation is used,

where X is the value entered in SPBRG:

164*

OSCFX

BaudRate

When a baud rate of 4800bps with a frequency of 8MHz is entered into the equation

the resulting X value is 25.04, so 25 is the value used in SPBRG.

The RCSTA register is set in the following manner:

Bit 7: 1 for Serial port enabled

Bit 6: 0 for Enables 8-bit reception

Bit 5: 0 Don t care for Asynchronous mode

Bit 4: 1 to Enable continuous receive (called CREN)

Bit 3: 0 Don t care for 8-bit mode

Bit 2: 0 for no Overrun error(OERR)

Bit 1: 0 for no Framing error(FERR)

Bit 0: 0 Don t care for 8-bit mode

When transmitting input messages to the GPS system to initialize data, the data

message had to be inserted in the PIC s EEPROM via MPLAB before programming to PIC

(an .ECH file can be created with your EEPROM input by exporting a file (MPLAB), this

file is easier to load than re-inputting every time), because it consumed too much RAM.

Data is transmitted bit by bit via the TXREG register, the TSR register must be polled to

see whether the bit was sent out or not when TSR is empty only can u fill in the next bit.

Interrupts are undesired in this mode.

Page 65: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 65

For Universal Asynchronous reception, the 6th and 7th bit of the INTCON register

must be set, to enable interrupts, along with the 5th bit of register PIE1. An interrupt occurs

(bit5 of register PIR is set) under three cases, when a byte is received successfully, when an

OERR (Overrun error) or when a FERR (Framing error) occurs. If a FERR occurs the

message is discarded. The message is valid if; the message starts with a $ and ends with

0D 0A, the GPS sends an A in the 19th byte, no FERR error occurs, and the CRC check is

correct. If the message is valid, SPI communication transmits the latitude, longitude and

heading to the Main PIC, Also the RF transmits function is called to send this data (for use

in the simulator). This code in detail can be seen in APPENDIX B: CONTROL CODE.

Page 66: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 66

4.4.2 Radio Transceiver

This RF device is called a transceiver in the sense that the same unit can send and

receive, to and from another identical unit. Operating frequency is 2.4GHz, and data

transmission rate can be selected at either 250Kbps or 1Mbps. 250kbps works at a longer

range of 280m but after testing, range proved to be approximately 180m. Also 250kbps

improves receiver sensitivity. There are two modes direct mode and shock burst mode.

Shock burst works at a lower current and relaxed PIC operation. Low current consumption

occurs by using an onboard FIFO to transmit data at a low rate then transmit at a high rate.

PIC resources are saved by having an onboard CRC creator/checker for

transmitting/receiving respectively. Pre-amble, address, and CRC are stored on a buffer on

the RF then transmitted out, instead of letting the PIC do all this work. The transceiver can

receive simultaneously on two different channels. Only one channel was used in this

project.

Pins used

Used pins were CE (Chip Enable), CS (Chip Select), CLK (Clock), DR1 (Data

Ready1), DATA1, Vcc, and GND (1 represents pins pertaining to Channel1). The

transceiver requires a configuration word of up to 15 bytes. This is done through three pins;

CS, CLK and DATA1. Generally CE is turned off, CS is turned on, a delay is done to allow

onboard processing, and then data is fed in bit by bit as the clock toggles. The Shock burst

configuration word is as follows:

Shock Burst configuration Word:

The section bit[119:16] contains the segments of the configuration register dedicated to

Shock Burst operational protocol. After VDD is turned on Shock Burst configuration is done

once and remains set whilst VDD is present. During operation only the first byte for

frequency channel and RX/TX switching need to be changed.

Page 67: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 67

PLL_CTRL

Bit 121-120:

Controls the setting of the PLL for test purposes. With closed PLL in TX no

deviation will be present. For normal operational mode these two bits must both be low.

DATAx_W

Bit 119 112:

DATA2_W: Length of RF package payload section for receive-channel 2.

Bit 111 104:

DATA1_W: Length of RF package payload section for receive-channel 1.

NOTE:

The total number of bits in a Shock Burst RF package may not exceed 256!

Maximum length of payload section is hence given by:

DATAx_W(bits) = 256 (ADDR_W+ CRC)

ADDRx

Bit 103 64:

ADDR2: Receiver address channel 2, up to 40 bit.

Bit 63 24: ADDR1

ADDR1: Receiver address channel 1, up to 40 bit.

*NOTE:

Bits in ADDRx exceeding the address width set in ADDR_W are redundant and can

be set to logic 0.

Page 68: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 68

ADDR_W & CRC

Bit 103 64:

ADDR2: Receiver address channel 2, up to 40 bit.

Bit 63 24: ADDR1

ADDR1: Receiver address channel 1, up to 40 bit.

NOTE:

Bits in ADDRx exceeding the address width set in ADDR_W are redundant and can

be set to logic 0.

ADDR_W & CRC

Bit 23 18:

ADDR_W: Number of bits reserved for RX address in Shock Burst packages.

NOTE:

Maximum number of address bits is 40 (5 bytes). Values over 40 in ADDR_W are

not valid.

Bit 17:

CRC_L: CRC length to be calculated by nRF2401 in Shock Burst.

Logic 0: 8 bit CRC

Logic 1: 16 bit CRC

Bit: 16:

CRC_EN: Enables on-chip CRC generation (TX) and verification (RX).

Logic 0: On-chip CRC generation/checking disabled

Logic 1: On-chip CRC generation/checking enabled

Page 69: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 69

This section of the configuration word handles RF and device related parameters.

Modes:

General device configuration:

Bit 15:

RX2_EN:

Logic 0: One channel receive

Logic 1: Two channels receive

NOTE:

In two channel receive, the nRF2401 receives on two, separate frequency

channels simultaneously. The frequency of receive channel 1 is set in the configuration

word bit[7-1], receive channel 2 is always 8 channels (8 MHz) above receive channel 1.

Bit 14:

Communication Mode:

Logic 0: nRF2401 operates in direct mode.

Logic 1: nRF2401 operates in Shock Burst mode

Bit 13:

RF Data Rate:

Logic 0: 250 kbps

Logic 1: 1 Mbps

*NOTE:

Utilizing 250 kbps instead of 1Mbps will improve the receiver sensitivity by 10 dB.

1Mbps requires 16MHz crystal.

Page 70: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 70

Bit 12-10:

XO_F: Selects the nRF2401 crystal frequency to be used:

Bit 9-8:

RF_PWR: Sets nRF2401 RF output power in transmit mode:

RF channel & direction

Bit 7 1:

RF_CH#: Sets the frequency channel the nRF2401 operates on.

The channel frequency in transmit is given by:

ChannelRF =2400MHz + RF_CH# * 1.0MHz

RF_CH #: between 2400MHz and 2527MHz may be set. The channel frequency in data

channel 1 is given by:

ChannelRF =2400MHz + RF_CH# * 1.0MHz

(Receive at PIN#8)

RF_CH #: between 2400MHz and 2524MHz may be set.

The channel frequency in data channel 2 is given by:

ChannelRF =2400MHz + RF_CH# * 1.0MHz + 8MHz

(Receive at PIN#4)

RF_CH #: between 2408MHz and 2524MHz may be set.

Page 71: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 71

Bit 0:

Set active mode:

Logic 0: transmit mode

Logic 1: receive mode

For more intricate details about the configuration word refer to the nRF2401 datasheet page

19.

Within Shockburst mode there are four different modes. They are displayed in the

following table.

ACTIVE MODE

There are two different options in Active mode, Transmit and Receive.

Transmit

1. When the application MCU has data to send, set CE high. This activates nRF2401

onboard data processing.

2. The address of the receiving node (RX address) and payload data is clocked into the

nRF2401. The application protocol or MCU sets the speed <1Mbps (ex: 10kbps).

3. MCU sets the CE to low, this activates a nRF2401 Shock Burst transmission.

4. nRF2401 Shock Burst:

RF front end is powered up

RF package is completed (preamble added, CRC calculated

Data is transmitted at high speed (250 kbps or 1 Mbps configured by user).

nRF2401 return to stand-by when finished

Page 72: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 72

Receive

1. Correct address and size of payload of incoming RF packages are set when nRF2401 is

configured to Shock Burst RX.

2. To activate RX, set CE high.

3. After 200ms settling, nRF2401 is monitoring the air for incoming communication.

4. When a valid package has been received (correct address and CRC found), nRF2401

removes the preamble, address and CRC bits.

5. nRF2401 then notifies (interrupts) the MCU by setting the DR1 pin high.

6. MCU may (or may not) set the CE low to disable the RF front end (low current mode).

7. The MCU will clock out just the payload data at a suitable rate (ex. 10kbps).

8. When all payload data is retrieved nRF2401 sets DR1 low again, and is ready for new

incoming data package if CE is kept high during data download. If the CE was set

low, a new start up sequence can begin.

The following flowchart displays the processes of receiving and transmitting.

Page 73: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 73

CONFIGURATION MODE

Similar to active mode Configuration mode has two options, Configure Transmitter, and

Configure Receiver.

Configure Transmitter

1. In configure transmitter, CE is turned off, and CS is turned on.

2. DATA1 with CLK send the configuration word to the RF.

3. A delay of (1ms) is issued to allow ample time for onboard processing.

4. Both CE and CS are turned off.

Configure Receiver

1. In configure receiver, CE is turned off and CS is turned on.

2. A delay (1ms) is issued. The configuration is then sent through DATA1 from the PIC

as the clock toggles.

3. CE and CS are then turned off and a delay (1ms) is used also for onboard processing.

4. CE is then left on as to enable receiving.

STAND-BY MODE

Stand by mode is used to minimize average current consumption while maintaining

short start up times. In this mode, part of the crystal oscillator is active. Current

consumption is dependent on crystal frequency.

POWER DOWN MODE

In power down the nRF2401 is disabled with minimal current consumption,

typically less than 1µA. Entering this mode when the device is not active minimizes

average current consumption, maximizing battery lifetime.

Page 74: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 74

DATA PACKAGE DESCRIPTION

Data packages contain four main sections, in MSB order Pre-amble, address,

payload and CRC. Pre-amble is either 4 or 8 bits and is added to the data packet. Address is

between 8 and 40 bits. Payload is the desired data being transmitted or received. CRC is

either 8 or 16 bits and used for validating message. More detail about the data package can

be seen in the table below.

For information regarding delays, (please refer to the RF-24G datasheet page22).

Recommendations:

1. Delays should be taken very carefully, ample time is required for onboard

processing.

2. Sequence of turning on CE and CS should be very accurate, or the transceiver will

not operate as desired.

3. Configuration word should be set very carefully.

4. Configuration word entry starts from the MSB to the LSB.

5. This IC is unlike other ICs, it is very sensitive to physical shock and short circuits,

three of these units were irreversibly damaged, which in our case cost much time.

Page 75: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 75

4.5 RC UNIT

The main purpose of this RC Unit besides enabling RC mode, is that the user can

interfere manually should any errors occur, such as vehicle misguidance. This can save the

vehicle from possible crashes.

1. KEYPAD TESTING

Required components are the keypad encoder MM74C923, 0.1uF capacitor, 1uF

capacitor, and a 16 key keypad. The 1uF capacitor determines the debounce key mask. This

is done by creating a debounce period of 0.01s (delay) of on the encoder. The 0.1uF

determines the scanning frequency at 400Hz. The encoder has an output enable as which

should be set at active low.

These CMOS key encoders provide all the necessary logic to fully encode an array

of SPST switches. The keyboard scan can be implemented by either an external clock or

external capacitor. These encoders also have on-chip pullup devices which permit switches

with up to 50 KHz on resistance to be used. No diodes in the switch array are needed to

eliminate ghost switches. The internal debounce circuit needs only a single external

Page 76: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 76

capacitor and can be defeated by omitting the capacitor. A Data Available output goes to a

high level when a valid keyboard entry has been made. The Data Available output returns

to a low level when the entered key is released, even if another key is pressed. The Data

Available will return high to indicate acceptance of the new key after a normal debounce

period; this two-key rollover is provided between any two switches. An internal register

remembers the last key pressed even after the key is released. The TRI-STATEÉ outputs

provide for easy expansion and bus operation and are LPTTL compatible.

Both the keyboard scan rate and the key debounce period by altering the oscillator

capacitor, COSE, and the key debounce mask capacitor, CMSK. Thus, the MM74C923's

performance can be optimized for many keyboards. The keyboard encoders connect to a

switch matrix that is 4 rows by 4 columns or 5 rows by 4 columns (MM74C923). When no

keys are pressed, the row inputs are pulled high by internal pull-ups and the column outputs

sequentially output a logic 0 . These outputs are open drain and are therefore low for 25%

of the time and otherwise off. The column scan rate is controlled by the oscillator input,

which consists of a Schmitt trigger oscillator, a 2-bit counter, and a 2±4-bit decoder. When

a key is pressed, key 0, for example, nothing will happen when the X1 input is off, since Y1

will remain high. When the X1 column is scanned, X1 goes low and Y1 will go low. This

disables the counter and keeps X1 low. Y1 going low also initiates the key debounce circuit

timing and locks out the other Y inputs. The key code to be output is a combination of the

frozen counter value and the decoded Y inputs. Once the key debounce circuit times out,

the data is latched, and the Data Available (DAV) output goes high. If, during the key

closure the switch debounces, Y1 input will go high again, restarting the scan and resetting

the key debounce circuitry. The key may debounce several times, but as soon as the switch

stays low for a debounce period, the closure is assumed valid and the data is latched. A key

Page 77: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 77

may also debounce when it is released. To ensure that the encoder does not recognize this

debounce as another key closure, the debounce circuit must time out before another closure

is recognized. The two-key roll-over feature can be illustrated by assuming a key is pressed,

and then a second key is pressed. Since all scanning has stopped, and all other Y inputs are

disabled, the second key is not recognized until the first key is lifted and the key debounce

circuitry has reset. The output latches feed TRI-STATE, which is enabled when the Output

Enable (OE) input is taken low.

The following circuit schematic was

used to connect the keypad to the

encoder.

For testing refer to the section 5.1 Testing.

Page 78: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 78

TESTING TROUBLESHOOTING

& REDESIGN

5.1 TESTING

In embedded systems, programming involves a lot of debugging, and besides

software errors, many hardware errors occur also. Errors such as such as misplaced or loose

wiring, close wires, wrong filenames (that simulate and run fine but give never work in a

circuit), incorrectly connected hardware or incorrect register settings. When something does

not work many possibilities come to mind, which makes debugging a tiresome and long

process. That s why a bottom-down programming approach is much more efficient and

time saving.

5.1.1 LED TESTING

Since we cannot see any variables during runtime without probably having special

hardware called an ICD. This is the simplest straight forward method one can use for

testing, for fast observations.

5.1.1.1 ACCELEROMETER TESTING

In order to test the functionality and the accuracy of the accelerometer readings a

simple code was written to light up 4 LEDs in a row as a scale for inclination. The greater

the angle of inclination the more LEDs turn on.

5.1.1.2 GYROMETER TESTING

The same method was applied on the gyrometer as the accelerometer but instead of

measuring angle, it measured angular velocity which we would later on integrate to acquire

the displacement angle.

Page 79: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 79

5.1.1.3 SPI TESTING

In order to test the SPI functionality a couple of LEDs were connected onto the

Main and Secondary PIC. These LEDs would light up interchangeably with every message

transferred through.

5.1.1.4 RC UNIT TESTING

Initially the Keypad and it s encoder are connected to four LED s in order to

indicate the binary output of what was pressed.

This shows results of the first experiment to get

the binary output of the encoder to the LEDs

After the previous experiment was successful, the

next step was to see if the MCU would work

perfectly along with the previous system.

This experiment shows the output of the keypad

through the MCU. The LED s turn on by the MCU,

by showing the binary output of the button pressed.

LEDs were arranged in order of 4-bits in this

experiment.

Page 80: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 80

5.1.2 LCD TESTING

The LCD connected to a PIC was a great method to test individual code segments

before integrating them into a greater whole. SPI, ultrasonic sensors, RF, GPS system, were

all tested individually using this method.

The preferable LCD of choice to use is the Hitachi HD44780. It proved simple,

efficient and the libraries are readily available in most PIC programming packages. The

connections are illustrated as follows:

Bit 0: Ground (GND). Bit 1: Power (VCC). Bit 2: Variable Resistance (Potentiometer) placed for adjusting contrast. Bit 3: Control line RS (Register Select). Bit 4: Control line R/W (Read/Write). Bit 5: Control line E (Enable). Bit 6: Data Input 0. Bit 7: Data Input 1. Bit 8: Data Input 2. Bit 9: Data Input 3. Bit 10: Data Input 4. Bit 11: Data Input 5. Bit 12: Data Input 6. Bit 13: Data Input 7. Bit 13: VCC for the Backlight. Bit 13: GND for the Backlight.

*NOTE:

Please see APPENDIX B for the sample code of the Liquid Crystal Display.

Page 81: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 81

5.1.2.1 ULTRASONIC TESTING

In order to test the blind spot of the ultrasonic sensor and to verify its sensitivity, the

output from the ultrasonic sensor was connected to a PIC and was measured printed on an

LCD for a better view of the oscillations in readings.

5.1.2.2 ACCELEROMETER TESTING

After performing the LED test on the accelerometer readings it was required to see

the angle in degrees in a human readable form, so the accelerometer output was measured

and the angle calculated in the PIC and displayed onto an LCD in degrees.

Page 82: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 82

5.1.2.3 RC UNIT TESTING

Controlling the RF-24G via the keypad

A program is configured so options would be sent to the plane via the RF by the

touch of a button from the keypad. The keypad sends an interrupt, that lets the MCU read

the unique value from the encoder. The MCU then identifies which button was pressed and

in turn sends a unique message to the RF that the MCU on the plane identifies and acts

accordingly. The following options were in mind.

1. Start

2. Off

3. Hover

4. Land

5. Left

6. Right

7. Forward

8. Backward

9. Land

Use of the LCD was integrated into this system, to attain a viewable output that can

be verified. The transceiver not only sends out messages to the plane, but receives

information from the plane, regarding latitude and longitude, heading and velocity.

This experiment shows the LCD

working with the RF and the keypad

system. The LCD shows the current

button pressed.

Page 83: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 83

5.1.2.4 GPS TESTING

The final test performed was to see the output of the GPS receiver onto the LCD to

verify the USART connection with the GPS receiver.

5.1.3 RF TESTING

Since LCDs can prove to be buggy and slow an alternative had to be chosen, since

the RF-24G is much faster than an LCD we tested the outputs and variables of some more

complex programs than possible with and LCD or LEDs.

5.1.3.1 ULTRASONIC TESTING

The Ultrasonic readings taken from the previous ultrasonic program for LCD testing

where taken and instead of displaying them on the LCD, they were transmitted wireless to a

computer to be displayed onto the screen at a much higher refresh rate.

5.1.3.2 GYROMETER TESTING

Initially testing the gyrometer with the LCD was more desirable, but the LCD was

quite slow when keeping up with the gyrometer. Testing it with the RF was a better

solution. The PIC code integrates the required value and constantly adds the values to

provide the current angle. This value is sent through the RF transmitter. The RF receiver is

connected to the RS232 port. A JAVA program extracts values from the serial port and

displays it on a GUI. Pictures below show this process. The first picture shows the

receiving RF node, the second shows the general circuit, and the last shows the angle being

displayed while the gyro is being tilted. Code for this procedure can be found in

APPENDIX B : CONTROL CODE.

Page 84: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 84

Page 85: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 85

5.1.3.3 RC UNIT TESTING

Controlling the RF-24G via the keypad

A program is configured so options would be sent to the plane via the RF by the

touch of a button from the keypad. The keypad sends an interrupt, that lets the MCU read

the unique value from the encoder. The MCU then identifies which button was pressed and

in turn sends a unique message to the RF that the MCU on the plane identifies and acts

accordingly. The following options were in mind.

1. Start

2. Off

3. Hover

4. Land

5. Left

6. Right

7. Forward

8. Backward

9. Land

Use of the LCD was integrated into this system, to attain a viewable output that can

be verified. The transceiver not only sends out messages to the plane, but receives

information from the plane, regarding latitude and longitude, heading and velocity.

This experiment shows the LCD

working with the RF and the keypad

system. The LCD shows the current

button pressed.

Page 86: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 86

5.2 PREVIOUS CHASSIS DESIGNS:

The team constructed three different chassis. The first three chassis were considered

failures. Assemblies of all three chassis are explained below, along with our reasons for

their disapproval. The final design is explained in the section above, conceptual design

and physical assembly .

PROTOTYPE CHASSIS 1

For initial design balsa wood was used, a very lightweight material, commonly used

in RC planes for its practical characteristics. A rectangular frame was made from several

balsa planks and glued together with an adhesive agent, super glue. Multiple planks were

used on each side to give rigidity to the plane. The corners were reinforced with triangular

pieces of balsa wood which would fit in each of the four inner corners of the plane adding

more rigidity to the welds of the plane. Four equal length legs also made of balsa wood are

extended from the plane, in order to give the plane a safe landing.

A thick bridge of balsa wood was extended from the mid-section of one of the sides

of the frame to the other side. The top of this bridge was designed to carry our

accelerometer, gyrometer, camera, GPS and PIC. On the bottom of the bridge we designed

a battery compartment. The accelerometer and gyrometer were placed at the absolute center

of the body in the center of the bridge. They were placed on top of each other. They must

both be placed in the center in order to give accurate readings of acceleration and tilt. We

decided to put the battery compartment on the bottom of the bridge. Considering it s the

heaviest single object on the plane it was put on the bottom of the bridge in the center in

order to lower the center of gravity of the vehicle and provide better balance and easier

control. There was an ultrasonic sensor placed on the bottom of the battery compartment in

order to properly detect height. A picture of the first chassis is shown below. It weighed

197 grams.

Page 87: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 87

In the very end after testing lift with this frame, the chassis was too bulky and heavy

where the plane could barely lift it. Another reason for the lack of power was the triangular

pieces of balsa in the corners which blocked airflow under the propellers. The motors were

also delicate in their fastening to the frame. Our team then decided to reconstruct another

chassis, a lighter one, reduced in size.

PROTOTYPE CHASSIS 2

The same design was used again, except the multiple layers were removed to reduce

weight and thinner planks were used all over the plane. The rectangular frame was designed

so that the when any two adjacent propellers face each other the distance between the

propellers would be a bare 0.5cm. Struts were also added to better fasten the motors. Four

struts are used to fasten all motors to the corners of the frame with screws, and the strut is

fastened to the motor with a plastic belt. The result was a much slighter and sleeker design

with better results than the previous design. This chassis weighed 93 grams. Pictures of the

second frame (top) and a picture of the first and second frame together showing relative

size (bottom) are placed below. Notice the triangular reinforcements in the first picture

(compare to the second) were clipped in order to strengthen the aerodynamic vortex caused

under the rotors.

Page 88: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 88

After testing the second chassis we noticed that the triangular reinforcements were

inhibiting lift by disturbing the air vortex created by the propellers. This caused

consideration for a third chassis to be built.

Page 89: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 89

PROTOTYPE CHASSIS 3

An X-shaped chassis was constructed without the triangular reinforcements, and the

same thin planks were used again. The lengths of the planks were selected once again to

leave very low distances between the rotors when they meet. This chassis weighed a mere

47.5 grams. The arms of the chassis were trimmed in a triangular shape near the rotors to

help with air flow. But the chassis was very fragile, and any potential accidents would

probably result in a broken chassis and damaged onboard components. The team then

considered a carbon-fiber chassis as an alternative, because it suddenly became available at

a local hobby vendor. The construction of this chassis is explained thoroughly in the

conceptual design and physical assembly section above. A picture of the 3rd chassis is

placed below.

Page 90: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 90

5.3 RF DRIVERS

5.3.1. Laipac RF TX / RX

The Laipac A2ABTAE-D2 transmitter/receiver set was used for communication. A

parallel port sends signals out to the encoder, which in turn encodes signals to the

transmitter, to send to the receiver. The receiver then receives from the transmitter and

sends it to a decoder which gives the data to another microcontroller. The transmitter and

receiver circuits were placed on two different boards. Circuit design and actual pictures of

these circuits are placed below. (On boards below, transmitter is on left, and receiver is on

right.)

After testing it was decided that this was a very inefficient communication system

for a variety of reasons. It was very slow, its range was very limited, and it s payload was

very limited to 1 byte only, not to mention it had no checksum system. The RF-24G proved

to be a superior alternative.

Page 91: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 91

5.3.2 RF DRIVER

The RF transceivers have two separate boards, in this section the one explained is

the board that connects to a parallel port on a land based PC. This board was created in

order to have the RF transceiver and GPS connect to the parallel port of a PC, to be used as

an evaluation board for testing.

Page 92: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 92

5.4 CONFIGURATION 1:

This configuration was used on the second chassis. The PIC of use was the 16F877.

It was configured so that one of the PICs was a Main and the other was a Secondary. The

battery was connected to a specifically designed power distributor. The power distributor

then supplies the large current to all four motor drivers. This board receives power from our

Li-Poly battery and supplies power through wires to the PICs, accelerometer, gyrometer,

and motor drivers which in turn supply power to the motors. There were four motor drivers

one for each of our motors. This motor driver is the same design explained in the analysis

and component level design and selection, except one 2SD1062 transistor was used per

motor driver, and optocouplers weren t yet implemented. All components of the plane were

integrated into one large circuit. Circuit designs of the 16F877 driver (top), motor driver

(center) and power distributor (bottom) are displayed below.

Page 93: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 93

Page 94: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 94

After implementation of this configuration was complete, results were quite

unfavorable for a variety of reasons. Tested lift was not enough to generate substantial

lateral thrust. The wattmeter would fluctuate between 6.9V-7.2V and 22A-25A. All these

boards were connected together by wires, and the male pin headers used caused two big

problems, loose wiring and consecutive pin contact. When any problems happened it was

very difficult to identify the source of the problem. With extensive testing our power

distributor board was completely destroyed, (JP2 and JP5 pins and surrounding wires were

destroyed a shown in the figure below) the huge current from the lithium polymer battery

caused the brass board to physically snap from the amount of heat the current generated.

Pictures of the burnt power distributor, 16F877 driver, and motor driver (from left to right)

are shown below.

Page 95: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 95

A picture of the plane in configuration one is placed below. The power distributor is

the leftmost board with the male deans connector attached to it. The 166F877 driver is seen

lying on the bridge alongside the RF receiver board. Boards mounted under the rotors are

the motor drivers. The Accelerometer and gyrometers are on the center of the bridge.

Ultrasonic sensors are mounted onto hinges and can be seen on the center of each side

plank.

The next phase of the project was testing and programming of accelerometer,

gyrometer and ultrasonic sensors. This was halted due to the negative results. The team

decided to revise their chassis, reduce wiring, and alter board configuration. This is

explained in the next section.

Page 96: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 96

5.5 CONFIGURATION 2:

PIC Implementation :

The onboard microprocessor receives signals from the accelerometer, gyrometer,

ultrasonic sensors, RF chip and GPS. According to the mode that is being run the

microprocessor controls the four motors accordingly via PWM. The team needed a

microprocessor that can accommodate all these functions. The PIC of choice was the

18F4431, a figure of the PIN diagram is placed below. The accelerometer and both

gyrometers are connected to port A, in the ADC pins. The ultrasonic sensors can release

output in three different ways; analog signal, digital signal or by Pulse Width period. Three

ultrasonic sensors are placed in the port E ADC pins, releasing analog output, and the last

two ultrasonic sensors are placed on port B pins RB6 and RB7. RF outputs connect to

Digital I/O pins, except DR1 which connects to a pin with an interrupt function. GPS chip

connects to the serial TX/RX pins of the PIC namely pins RC6 and RC7. A figure of the

pin diagram is placed below.

Page 97: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 97

This configuration was implemented on the second chassis also. The main idea of

this configuration was to reduce wiring to a bare minimum. In this configuration female pin

headers were used which are much more stiff in placement and possibility of consecutive

pin contact is low. A new microprocessor the 18F4431 was used, this PIC has four PWM

modules thus only one was needed for our UAV system saving weight and wiring and

eliminating sync time problems. The PIC, RF chip, accelerometer, gyrometers, motor

drivers, and power distribution circuit were integrated into one main board, The brain.

The accelerometer and gyrometer were placed in the center of the board and the brain was

to be mounted in the center of the body. The only visible wires were the ones coming from

the ultrasonic sensors to the brain. The onboard motor driver circuit was edited so that an

additional 2SD1062 was placed in parallel to the previous one to reduce Vce drop. Wires

connected to the battery were significantly widened to prevent melting. Diagrams of circuit

design, (top) actual board bottom, (center) and actual board with welded components

(bottom) are below.

Page 98: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 98

During the making of The brain there was a problem with line wiring of the RF

section, this called to make a new brain. It also came to the team s knowledge that

combining high rated power components with low power rated components with one

common ground could be hazardous. The low power rated components could malfunction

or burn. The team decided to design another brain, with motor drivers separated from the

control circuit. Also our programmer used to burn the 18F4431 PICS so testing couldn t be

implemented.

Page 99: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 99

5.6 Brain

Page 100: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 100

5.7 Correcting Gyro Output:

Connecting the Gyro directly to the ADC pin of the PIC yielded incorrect results,

because the gyro velocity variation signal was very low in voltage, some signals went

unrecognized. Say for example a rotation of 1 degree/sec would produce a 2mV signal on

the corresponding ADC pin. So N = 2mV * 1024/3.3V = 0.6206 which would be rounded

to 1. The error here is 61.1%!

A quick solution was creating a difference OP-AMP. A circuit schematic is

displayed below.

A potentiometer is connected to a 5V source and GND. Its output connects to the

negative op-amp input, it is adjusted to create a difference, relative to the signal connected

to the positive terminal. VSS determines your voltage output at maximum gain, so that VOUT

can never exceed VSS. The gain in this circuit is simply:

1

fRA

R

The VOUT signal in turn is:

1 21

( ) fOUT

RV V V

R

where OUT SSV V

Assuming you had a difference of 0.1V between both OPAMP terminals,

Rf=150K & R1=10K , gain would be 15 and Vout would be 1.5V. Sensitivity would

increase 15 fold, from 0.002V to 0.03V. In the end the OPAMP was removed because it s

Page 101: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 101

output proved to be highly unstable, which yielded worse results, so returning to a direct

signal and averaging it in the software was a better alternative.

Old RF

E$4,5,6 and E$7 are silicone diodes, E$1 is 74LS126AP tri-state buffer, the E$8, E$9,

E$10, E$11 are 10K pull down resistors, E$3 is the RF connection, and E$2 is the main

circuit connection. E$2 righter most pin is VCC 5V, The E$2 leftermost pin is a 3.3V

connection beside it is GND, the rest are RF signals coming from the 5V logic. E$4, E$5,

E$6, and E$7 are the diodes displayed below. They are connected in this manner because

DATA1 is bi-directional. The 74LS126AP receives inputs from the PIC, and transmits CE,

CS, CLK1 to the RF accordingly.

RF interface board

Page 102: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 102

FUTURE IMPLEMENTATIONS

If there was more time at hand, gyrometer and accelerometer outputs would be

corrected in order to reduce if not eliminate output drift. Immediately after that; hover

mode, RC mode, GPS mode, and tracking mode would be tested. Ultrasonic sensors would

be connected to mechanical servos that move the sensors according to angles. The sensor

that assists in height would be connected to a 3D servo, and all other sensors would be

connected to a 2D servo. This would give us highly accurate estimation of height, and

would detect obstacles that are perpendicular to the gravity vector. (Not objects that are

above or under the UAV.) High powered brushless motors would also be a great variation

to our design. Compared to brushed motors, they consume much less power, have higher

efficiency, and they have longer life. A long range (near RF range) high resolution camera

would also be a good improvement. If time was ample, our chassis would be redesigned to

a circular design where the rotors are placed under the chassis and face downwards. The

main board would be also under the vehicle along with the battery, leaving the upper side

of the plate empty in order to carry objects.

Page 103: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 103

CONCLUSION

The local market does not have high quality products which were needed for this

project. Almost all of our components were ordered from abroad. Shipping times for these

parts caused big delays on work time. Unfortunate accidents subjected us to these delays.

The most difficult challenge was the race against time and due to the constraints it

imposed on this project and due to the nature of the project there was a lot of

undocumented equipments, experimentations, and analysis as time progressed.

Considering this project is an embedded system, a bottom-down programming

method was used, followed by integrating elements into a greater whole. All single

elements were tested and worked successfully. Only the gyrometer and accelerometer drifts

were not corrected and this led to an incomplete project. With more time Kalman filters or

PID control techniques could have been implemented.

Page 104: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 104

APPENDIX A : COMPONENT DATABASE

& CHARACTERISTICS

PART NUMBER DESCRIPTION QUANTITY

GWS EPS-350C Motor 4

EPP1045 Propeller counter-rotating (sold in pairs) 4

EHS300 Heat Sync 4

TP8000-2S4P Battery 1

109D Charger with Dean s connector 1

101D Wattmeter with Dean s connector 1

106 Blinky battery balancer 1

120 13.5V power supply 1

549 Blinky-thunderpower adapter 1

ADXL330 3-axis accelerometer 1

IDG300 2-axis gyrometer 3

SEN-00741 IMU 5 Degrees of Freedom 1

EM406 20 Channel GPS SiRF III Receiver 2

GPS-00653 EM406 SiRF III Evaluation Board - RS232 1

RF-24G Radio transceiver 2.4GHz 4

WRL-00713 Transceiver Development Node 2

WRL-00713 Ultrasonic sensors 5

GPS-00653 SirF III Evaluation board 1

WS-309-AS Miniature Lightweight Camera kit 200mW 1

HD747HOU 8-bit LCD 16*2 1

PIC-MCP-USB USB PIC programmer 1

JDM RS232 PIC programmer 2

2N2222A Transistor 10

2SD1062 High power Transistor 12

TIP120 Transistor 10

Page 105: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 105

PC817 Optocoupler 6

74LS126A Quad tri-state buffer 4

HT640 Transmitter Encoder IC 2

TWS-434A Radio transmitter 2

RWS-434 Radio receiver 2

HT-648L Receiver Decoder IC 2

MM74C923 16/20 key (Touchpad) Encoder 2

L7805CV 5.0V Regulator 30

3.3V Regulator 10

8 MHz Crystal 5

10 MHz Crystal 2

16 MHz Crystal 1

20 MHz Crystal 5

32 MHz Crystal 2

37 MHz Crystal 1

40 MHz Crystal 1

1

1W Resistor

4

3.4K Resistor

5

100 Resistor

30

1.5K Resistor

8

330 Resistor

20

15 5W Resistor

8

10K Resistor

10

3.3K Resistor 8

100K Potentiometer

4

1M Potentiometer

3

22pF Capacitor 20

10uFCapacitor 5

100nF Capacitor 5

0.33uF Capacitor 6

470uF Capacitor 5

18F4431 MCU Mirocontroller unit 5V 40MHz (max)

Page 106: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 106

16F877 MCU Mirocontroller unit 5V 20MHz (max)

16F877A MCU Mirocontroller unit 5V 20MHz (max)

16LF877 MCU Mirocontroller unit (3/5)V 10MHz (max)

16LF777 MCU Mirocontroller unit (3/5)V 10MHz (max

Carbon Fiber tubes rectangular (1cm*1cm) 90cm 1

Carbon Fiber tubes cylindrical (Diameter = 1cm)

90cm

1

Epoxy (Hardener & Resin) 1

Ecuadorian Balsa wood (10cm*1cm) 90cm 2

Ecuadorian Balsa wood (1cm*1cm) 90cm 3

Ecuadorian Balsa wood (2.5cm*0.6cm) 90cm 5

Ecuadorian Balsa wood (2.5cm*1cm) 90cm 3

Ecuadorian Balsa wood (10cm*0.6cm) 90cm 2

DT830 Digital Multimeter (Avometer) 3

Page 107: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 107

APPENDIX B : CONTROL CODE

JAVA

RF WITH PARALLEL PORT

import parport.ParallelPort; import javax.swing.*; import java.awt.event.*; import java.awt.*;

class keytest extends JFrame implements KeyListener { JTextField keyText = new JTextField(1); JTextField function = new JTextField(30); JLabel action = new JLabel("Action"); JLabel keyLabel = new JLabel("Press To Start");

ParallelPort lpt1 = new ParallelPort(0x378); // 0x378 address for a port int j=0;

keytest() { super("KeyTest"); keyText.addKeyListener(this); setSize(350, 100); getContentPane().setLayout(new GridLayout(4,1)); getContentPane().add(keyLabel);

getContentPane().add(keyText); getContentPane().add(action); getContentPane().add(function);

setVisible(true); } private void sleeper() {

try {

lpt1.write(j); Thread.sleep(1000); // in miliseconds

} catch(InterruptedException e)

{ keyLabel.setText("You numbnut you did this :-

"+e.toString()); }

} public void keyPressed(KeyEvent input) { /*int[] receiver = new int[30];

Page 108: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 108

int toggler; int j=0; toggler = lpt1.read(); if (toggler>=128) { for(int i=0;i<12;i++) receiver[i]=lpt1.read();

}*/ int j=0;

char key = input.getKeyChar(); keyLabel.setText("You pressed " + key); keyText.setText(""); int aByte=0; if(key=='a') {

aByte=8+1; // BINARY = 1001 sleeper(); lpt1.write(aByte); // sleeper();

function.setText("Increasing Power"); } else if(key=='z') {

aByte=8+2; // BINARY = 1010 sleeper(); lpt1.write(aByte); // sleeper(); function.setText("Decreasing Power");

} else if(input.getKeyCode()==input.VK_UP) {

aByte=8+3; // BINARY = 1011 sleeper(); lpt1.write(aByte);

// sleeper(); function.setText("Forward " );

} else if(input.getKeyCode()==input.VK_DOWN) { aByte=8+4; // BINARY = 1100 sleeper(); lpt1.write(aByte);

// sleeper(); function.setText("Backward"); } else if(input.getKeyCode()==input.VK_LEFT) { aByte=8+5; // BINARY = 1101 sleeper(); lpt1.write(aByte);

Page 109: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 109

// sleeper(); function.setText("Left Direction"); } else if(input.getKeyCode()==input.VK_RIGHT){ aByte=8+6; // BINARY = 1110 sleeper(); lpt1.write(aByte);

// sleeper(); function.setText("Right Direction");

} else

function.setText("WRONG KEY!");

// for(int i=0;i<2000;i++); // to reduce frequency of parallel port to PIC // aByte=00; // lpt1.write(aByte); }

public void keyTyped(KeyEvent txt) { // do nothing }

public void keyReleased(KeyEvent txt) { // do nothing }

public static void main(String[] arguments) { keytest frame = new keytest(); } }

JAVA CRC CHECKER

import javax.swing.*; import java.awt.event.*; import java.awt.*;

public class NMEAparser extends JFrame implements ActionListener {

private JPanel back,north; private JTextField input,output; private JButton crc; public NMEAparser() {

north=new JPanel(); back=new JPanel(new BorderLayout());

Page 110: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 110

getContentPane().add(back); input=new JTextField(30); output=new JTextField(8); output.setEditable(false); north.add(input); north.add(output); back.add(north,BorderLayout.NORTH); crc=new JButton("Calculate Checksum"); back.add(crc,BorderLayout.EAST); setSize(500,100); setVisible(true); setDefaultCloseOperation(EXIT_ON_CLOSE); crc.addActionListener(this);

} public void actionPerformed(ActionEvent e) {

String text=input.getText(); char crcResult=0; int i=0; while(i<text.length()) {

if(text.charAt(i)=='$') {

i++; continue;

} if(text.charAt(i)=='*')

break; crcResult^=text.charAt(i); i++;

} int crcResultHex[]=new int[2]; crcResultHex[0]=(int)(crcResult&0x0F); crcResult>>=4; String result; crcResultHex[1]=(int)(crcResult&0x0F); if(crcResultHex[0]>9)

result=String.valueOf((char)(crcResultHex[0]-10+'A')); else

result=String.valueOf(crcResultHex[0]); if(crcResultHex[1]>9)

result=String.valueOf((char)(crcResultHex[1]-10+'A'))+result; else

result=String.valueOf(crcResultHex[1])+result; output.setText(result);

} public static void main(String args[]) {

new NMEAparser();

Page 111: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 111

}

}

Ultrasonic Code:

int i=0; void interrupt() { int i=0;

if (PIR1.ADIF == 1) { if((ADRESL+(ADRESH*256)) <= 41) { PORTB.f0 = 1; } else { PORTB.f0 = 0; } PIR1.ADIF = 0; INTCON = 0xC0; PIE1 = 0x40; } ADRESL = 0; ADRESH = 0; delay_ms(50); ADCON0.GO = 1; } void main() { INTCON = 0xC0; OPTION_REG = 0X80; PIR1 = 0x00; PIE1 = 0x40; ADCON1 = 0xCE; ADCON0 = 0x01;

TRISA = 0x01; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISE = 0x00;

PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0;

Page 112: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 112

ADCON0.GO = 1; TMR0=0;

while(1); }

Tests 5 Ultrasonic sensors

int i = 0; void chooseChannel() { if (i > 4) { i = 0;} if (i == 0) { ADCON0 = 0b00000001;} else if (i == 1) { ADCON0 = 0b00001001;} else if (i == 2) { ADCON0 = 0b00010001;} else if (i == 3) { ADCON0 = 0b00011001;} else if (i == 4) { ADCON0 = 0b00100001;} } void interrupt() { int j=0;

if (PIR1.ADIF == 1) { if((ADRESL+(ADRESH*256)) > 41) { if (i == 0) { PORTB.f0 = 0; } else if(i == 1) { PORTB.f1 = 0; } else if (i == 2) { PORTB.f2 = 0; } else if (i == 3) {

Page 113: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 113

PORTB.f3 = 0; } } else if((ADRESL+(ADRESH*256)) <= 41)

{ if (i == 0) { PORTB.f0 = 1; } else if(i == 1) { PORTB.f1 = 1; } else if(i == 2) { PORTB.f2 = 1; } else if(i == 3) { PORTB.f3 = 1; } } ADRESL = 0x00; ADRESH = 0x00; PIR1.ADIF = 0; INTCON = 0xC0; PIE1 = 0x40; } //i=(i+1)%4; //ADCON0=(ADCON0&0b11000001)|(i<<3); i++; chooseChannel(); for (j=0;j<40;j++); ADCON0.GO = 1; } void main() { INTCON = 0xC0; OPTION_REG=0X80; PIR1 = 0x00; PIE1 = 0x40; ADCON1 = 0xC2; ADCON0 = 0x01;

TRISA = 0xFF; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISE = 0xFF;

Page 114: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 114

PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; ADCON0.GO = 1; TMR0=0;

while(1); }

Ultrasonic LED Gauge

int i = 0; void chooseChannel() { if (i > 1) { i = 0;}

if (i == 0) { ADCON0 = 0b00000001;} else if (i == 1) { ADCON0 = 0b00001001;} } void interrupt() { int j=0;

if (PIR1.ADIF == 1) { if((ADRESL+(ADRESH*256)) <= 25) { if (i == 0) { PORTC.f4 = 0; PORTC.f5 = 0; PORTC.f6 = 1; PORTC.f7 = 0; } else if(i == 1) { PORTD.f5 = 0; PORTD.f6 = 0; PORTD.f4 = 1; PORTC.f7 = 0;

}

Page 115: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 115

} else if((ADRESL+(ADRESH*256)) < 41) { if (i == 0) { PORTC.f4 = 0; PORTC.f6 = 1; PORTC.f5 = 1; PORTC.f7 = 0; } else if(i == 1) { PORTD.f4 = 1; PORTD.f6 = 0; PORTD.f5 = 1; PORTC.f7 = 0; } } else if((ADRESL+(ADRESH*256)) < 80 ) { if (i == 0) { PORTC.f5 = 1; PORTC.f6 = 1; PORTC.f4 = 1; PORTC.f7 = 0; } else if(i == 1) { PORTD.f4 = 1; PORTD.f5 = 1; PORTD.f6 = 1; PORTC.f7 = 0; } } else if((ADRESL+(ADRESH*256)) > 80 ) { if (i == 0) { PORTC.f5 = 0; PORTC.f6 = 0; PORTC.f4 = 0; PORTC.f7 = 1; } else if(i == 1) { PORTD.f4 = 0; PORTD.f5 = 0; PORTD.f6 = 0;

Page 116: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 116

PORTC.f7 = 1; } } ADRESL = 0x00; ADRESH = 0x00; PIR1.ADIF = 0; INTCON = 0xC0; PIE1 = 0x40; } delay_ms(50); i++; chooseChannel(); for (j=0;j<100;j++); ADCON0.GO = 1; } void main() { INTCON = 0xC0; OPTION_REG=0X80; PIR1 = 0x00; PIE1 = 0x40; ADCON1 = 0xC4; ADCON0 = 0x01;

TRISA = 0x03; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISE = 0x00; PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0;

ADCON0.GO = 1; TMR0=0;

while(1); }

Ultrasonic with LCD:

int i = 0; int USRead = 0; char count = 0;

Page 117: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 117

char *Text = "Range: "; char *Text1 = "IN"; char str1[7]; unsigned double temp = 0.00; void interrupt() { if(count == 0) { count++; Lcd8_Config(&PORTB,&PORTD,3,2,0,7,6,5,4,3,2,1,0); Lcd8_Cmd(LCD_CURSOR_OFF); Lcd8_Out(1, 1, Text); Lcd8_Out(1, 15, Text1); } if(PIR1.ADIF == 1) { USRead = (ADRESL + (ADRESH*256)); temp = USRead*0.48828125;

temp*=100; for(i=0;i<6;i++) { if(i==2) continue; str1[5-i] = (((char)temp)%10)+'0'; temp = temp/10; } str1[6]='\0'; str1[3]='.'; Lcd8_Out(1, 8, str1); PIR1.ADIF = 0; INTCON = 0xC0; PIE1 = 0xC0; } ADRESL = 0; ADRESH = 0; delay_ms(50); ADCON0.GO = 1; } void main() { INTCON = 0xC0; OPTION_REG = 0x80; PIR1 = 0x00; PIE1 = 0x40; ADCON1 = 0xCE; ADCON0 = 0x01;

Page 118: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 118

TRISA = 0x01; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISE = 0x00; PORTA = 0x00; PORTB = 0x00; PORTC = 0x00; PORTD = 0x00; PORTE = 0x00;

ADCON0.GO = 1; TMR0 = 0; while(1); }

LCD:

unsigned char *text = "RCIDIOTS by"; unsigned char *text1 = "mikroElektronica";

void main() { TRISB = 0; // PORTB is output TRISD = 0; // PORTD is output

// Initialize LCD at PORTB and PORTD with custom pin settings Lcd8_Config(&PORTB,&PORTD,3,2,1,7,6,5,4,3,2,1,0);

Lcd8_Cmd(LCD_CURSOR_OFF); Lcd8_Out(1, 1, text); Lcd8_Out(2, 1, text1); while(1); }

GPS with LCD:

char *init = "Initializing...."; int i = 0; int j = 0; int row = 0; int count = 0; int column = 0; unsigned char temp1; unsigned char temp[38];

Page 119: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 119

unsigned char count1; void interrupt() { if(count == 0) { count++; Lcd8_Config(&PORTB,&PORTD,3,2,0,7,6,5,4,3,2,1,0); Lcd8_Cmd(LCD_CURSOR_OFF); Lcd8_Out(1,1,init); INTCON.T0IE=0; INTCON.T0IF=0; SPBRG = 25; TXSTA = 0x00; RCSTA = 0x90; PIR1 = 0x00; PIE1 = 0x20; } if (PIR1.RCIF == 1) { PORTC.f5=~PORTC.f5; temp1 = RCREG; if (temp1 == '$') { count1 = 0; row = 1; column = 1; i++; } else { temp[0]=temp1; temp[count1]=RCREG; count1=(count1+1)%37; i++;

if(i == 38) { for (j=0;j<38;j++) { if ((column == 16)&&(row == 1)) {row = 2; column = 1;} else if ((column == 16)&&(row == 2)) {row = 1; column = 1;} Lcd8_Chr(row, column, temp[j]); column++; } i = 0; PIR1.RCIE = 0; row = 1;

Page 120: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 120

column = 1; count1 = 0; temp[count1]='$'; } } if(temp1 == '$') { PORTC.f4=~PORTC.f4;} PIR1.RCIF = 0; PIR1.RCIE = 0; PIR1.RCIE = 1; RCSTA = 0x90; INTCON = 0xC0; } INTCON = 0xC0; } void main() { temp[37]='\0'; INTCON = 0xC0; OPTION_REG = 0x80; TMR0=0; INTCON.T0IE=1;

TRISA=0x00; TRISB=0x00; TRISC=0x80; TRISD=0x00; TRISE=0x00;

PORTA=0; PORTB=0; PORTC=0; PORTD=0; PORTE=0; while(1); }

PWM:

unsigned char flag; void interrupt() { if(INTCON.RBIF == 1) { INTCON.RBIF = 0; PORTA = ~PORTA; }

Page 121: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 121

} void main() { flag=0; INTCON=0xC8; T2CON=0x07; CCP1CON=0x0F; CCP2CON=0x0F; CCP3CON=0x0F; PR2 = 255;

TRISB = 0x00; TRISC = 0x00; TRISE = 0x00; PORTB = 0x00; //CCPR1L = 0; //CCPR2L = 0; while(1) { if(flag==0) { CCPR1L++; CCPR2L++; CCPR3L++; PORTC.f0=~PORTC.f0; } else if(flag==1) { CCPR1L--; CCPR2L--; CCPR3L--; PORTC.f3=~PORTC.f3; } if(CCPR1L == PR2) { flag=1; } else if(CCPR1L == 0) { flag=0; } delay_ms(100); } }

Page 122: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 122

Math Processing power:

/////////////////////////////////////////////////////////Test on the math operations to find out how long //////////////////////////////////////////////////////////it takes to do one sin operation and later tested to /////////////////////////////////////////////////////////find out how long it would take for all operations. //double x = 30.0; //double y = 0.0; //double b = 0.0; //double a = 0.0; //double u = 0.0; //double v = 0.0; double X = 25.2; double Y = 50.5; double T = 75.7; double ReferenceX = 0.0; double ReferenceY = 0.0; double ReferenceT = 0.0; void alex() { //PORTC = ~PORTC; //x = 30.0; ReferenceX = X*cos(Y)*cos(T) + Y*cos(Y)*sin(T) - T*sin(T); ReferenceY = X*(sin(Y)*sin(X)*cos(T)-cos(X)*sin(T)) + Y*(sin(Y)*sin(X)*sin(T)+cos(X)*cos(T)) + T*sin(X)*cos(Y); ReferenceT= X*(sin(Y)*cos(X)*cos(T)+sin(X)*sin(T)) + Y*(sin(Y)*cos(X)*sin(T)-sin(X)*cos(T)) + T*cos(X)*cos(Y); //y = sin(x); //b = cos(x); //u = log(x); //v = 6.45*y; PORTB = 0xFF; PORTC=0; } void main() { TRISC=0; TRISB=0; PORTC=0xFF; alex(); while(1); }

Test the payload and change the the configuration

unsigned char data_array[29]; unsigned char comand; void configure_transmitter(void) {

Page 123: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 123

unsigned char i,j; unsigned char config_setup[14], temp; TRISC = 0b00000000; PORTC.f5 = 0; PORTC.f4 = 1; delay_ms(1); config_setup[0] = 0b00000100; config_setup[1] = 0b01001110; config_setup[2] = 0b00100011; config_setup[3] = 0xe7; config_setup[4] = 0x00; config_setup[5] = 0x00; config_setup[6] = 0x00; config_setup[7] = 0x00; config_setup[8] = 0xe7; config_setup[9] = 0x00; config_setup[10] = 0x00; config_setup[11] = 0x00; config_setup[12] = 0x00; config_setup[13] = 0xe8; for (j = 14; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTC.f6 = config_setup[j-1].f7; PORTC.f5 = 1; PORTC.f5 = 0; config_setup[j-1] <<= 1; } } delay_ms(1); PORTC.f7 = 0; PORTC.f4 = 0; TRISC = 0b11111111; } void transmit_data(void) { unsigned char i, j, temp, rf_address; TRISC = 0b00000000; PORTC.f7 = 1; delay_ms(1); rf_address = 0b11100111; for(i = 0 ; i < 8 ; i++) { PORTC.f6 = rf_address.f7; PORTC.f5 = 1; PORTC.f5 = 0; rf_address <<= 1; } for(i = 0 ; i < 29 ; i++) {

Page 124: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 124

temp = data_array[i]; for(j = 0 ; j < 8 ; j++) { PORTC.f6 = temp.f7; PORTC.f5 = 1; PORTC.f5 = 0; temp <<= 1; } } PORTC.f7 = 0; TRISC = 0b11111111; } void main() { unsigned char x; TRISC = 0b11111111; PORTC = 0b00000000; TRISB = 0b00000001; PORTB = 0b00000000; TRISA = 0b00000000; TRISD = 0b00000000; PORTD = 0b00000000; TRISE = 0b00000000; TRISB = 0b00000001; INTCON = 0b11010000; configure_transmitter(); delay_ms(50); while(1) ; } void interrupt() { Lcd8_Config(&PORTB,&PORTD,3,2,1,7,6,5,4,3,2,1,0); Lcd8_Cmd(LCD_CURSOR_OFF); Lcd8_Out(1, 1, "hi ... We are IN"); delay_ms(1000); Lcd8_Cmd(LCD_CLEAR); if(INTCON.INTF == 1) comand=PORTC; if (comand==0x00) { data_array[0]='A'; data_array[1]='P'; data_array[2]='R'; data_array[3]='2'; data_array[4]=' '; Lcd8_Out(2, 1, "Button # 0"); } if (comand==0x01) {

Page 125: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 125

data_array[0]='A'; data_array[1]='P'; data_array[2]='R'; data_array[3]='2'; data_array[4]=' '; data_array[5]='P'; data_array[6]='e'; data_array[7]='t'; data_array[8]='e'; data_array[9]='r'; data_array[10]=' '; data_array[11]='A'; data_array[12]='l'; data_array[13]='e'; data_array[14]='x'; data_array[15]=' '; Lcd8_Out(2, 1, "Button # 1"); } if (comand==0x02) { data_array[0]='U'; data_array[1]='A'; data_array[2]='V'; data_array[3]=' '; data_array[4]=' '; data_array[5]='P'; data_array[6]='e'; data_array[7]='t'; data_array[8]='e'; data_array[9]='r'; data_array[10]=' '; data_array[11]='A'; data_array[12]='l'; data_array[13]='e'; data_array[14]='x'; data_array[15]=' '; data_array[16]='R'; data_array[17]='i'; data_array[18]='y'; data_array[19]='a'; data_array[20]='d'; Lcd8_Out(2, 1, "Button # 2"); } if (comand==0x03) { data_array[0]='U'; data_array[1]='A'; data_array[2]='V'; data_array[3]=' ';

Page 126: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 126

data_array[4]=' '; data_array[5]='P'; Lcd8_Out(2, 1, "Button # 3"); } transmit_data(); delay_ms(50); INTCON.INTF=0; }

Test rf with key pad and lcd

unsigned char data_array[4]; unsigned char comand;

void main() { unsigned char x; TRISC = 0b11111111; PORTC = 0b00000000; TRISB = 0b00000001; PORTB = 0b00000000; TRISA = 0b00000000; TRISD = 0b00000000; PORTD = 0b00000000; TRISE = 0b00000000; TRISB = 0b00000001; INTCON = 0b11010000; configure_transmitter(); while(1); } void interrupt() { Lcd8_Config(&PORTB,&PORTD,3,2,1,7,6,5,4,3,2,1,0); Lcd8_Cmd(LCD_CURSOR_OFF); Lcd8_Out(1, 1, "hi ... We are IN"); Lcd8_Cmd(LCD_CLEAR); delay_ms(100); if(INTCON.INTF == 1) comand=PORTC; if (comand==0x00) { data_array[0]=0x12; data_array[1]=0x34; data_array[2]=0xAB; data_array[3]=0xcd; Lcd8_Out(1, 1, "Peter"); } if (comand==0x01)

Page 127: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 127

{ data_array[0]='A'; data_array[1]='P'; data_array[2]='R'; data_array[3]='2'; Lcd8_Out(1, 1, "Alex"); } if (comand==0x02) { data_array[0]='U'; data_array[1]='A'; data_array[2]='V'; data_array[3]=' '; Lcd8_Out(1, 1, "Riyad"); } if (comand==0x03) { data_array[0]='U'; data_array[1]='A'; data_array[2]='V'; data_array[3]=' '; Lcd8_Out(1, 1, "Ruyan"); } transmit_data(); delay_ms(50); INTCON.INTF=0; }

Test rf with interrupt

unsigned char data_array[4]; unsigned char comand; void configure_receiver(void) { unsigned char i,j; unsigned char config_setup[3], temp; TRISD = 0b00000000; PORTD.f0 = 0; PORTC.f0 = 1; delay_ms(1); config_setup[0] = 0b00000101; config_setup[1] = 0b01001110; config_setup[2] = 0b00100011; for (j = 3; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTD.f1 = config_setup[j-1].f7; PORTD.f2 = 1; PORTD.f2 = 0;

Page 128: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 128

config_setup[j-1] <<= 1; } } PORTD.f0 = 0; PORTC.f0 = 0; TRISD = 0b00000010; delay_ms(1); PORTD.f0 = 1; PORTC.f0 = 0; } void configure_receiver2(void) { unsigned char i,j; unsigned char config_setup[3], temp; TRISD = 0b00000000; PORTD.f0 = 0; PORTC.f0 = 1; delay_ms(1); config_setup[0] = 0b00000101; config_setup[1] = 0b01001110; config_setup[2] = 0b00100011; for (j = 3; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTD.f1 = config_setup[j-1].f7; PORTD.f2 = 1; PORTD.f2 = 0; config_setup[j-1] <<= 1; } } PORTD.f0 = 0; PORTC.f0 = 0; TRISD = 0b00000010; delay_ms(1); PORTD.f0 = 1; PORTC.f0 = 0; } void receive_data(void) { unsigned char i, j, temp; PORTD.f0 = 0; data_array[0] = 0x00; data_array[1] = 0x00; data_array[2] = 0x00; data_array[3] = 0x00; for(i = 0 ; i < 4 ; i++) { for(j = 0 ; j < 8 ; j++) { temp <<= 1; temp.f0 = PORTD.f1; PORTD.f2 = 1; PORTD.f2 = 0;

Page 129: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 129

} data_array[i] = temp; } PORTD.f0 = 1; } void main() { unsigned char x; TRISC = 0b00000000; PORTC = 0b00000000; TRISB = 0b00000000; PORTB = 0b00000000; TRISA = 0b00000000; TRISD = 0b00000000; PORTD = 0b00000000; TRISE = 0b00000000; TRISB = 0b00000001; for (x = 0; x < 3; x++) {

PORTB.f1 = 1; delay_ms(25); PORTB.f1 = 0; PORTB.f3 = 1; delay_ms(25); PORTB.f3 = 0; PORTB.f4 = 1; delay_ms(25); PORTB.f4 = 0; }

configure_transmitter(); delay_ms(50); PORTB.f1 = 1; while(1); } void interrupt() { if(INTCON.INTF == 1) { configure_transmitter(); delay_ms(50); transmit_data(); delay_ms(50); configure_receiver2(); delay_ms(50); PORTB.f5=1; if ((data_array[0] == 0x12) && (data_array[1] == 0x34) && (data_array[2] == 0xAB) && (data_array[3] == 0xCD)) {

Page 130: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 130

if (PORTB.f4 == 1) { PORTB.f4 = 0; PORTB.f1 = 1; } else if (PORTB.f3 == 1) { PORTB.f3 = 0; PORTB.f4 = 1; } else if (PORTB.f1 == 1) { PORTB.f1 = 0; PORTB.f3 = 1; } } INTCON.INTF=0; } }

Test the rf trans and rec.

unsigned char data_array[4]; void main() { unsigned char x; TRISC = 0b00000000; PORTC = 0b00000000; TRISB = 0b00000000; PORTB = 0b00000000; TRISA = 0b00000000; TRISD = 0b00000000; PORTD = 0b00000000; TRISE = 0b00000000; TRISB = 0b00000001; for (x = 0; x < 3; x++) { PORTB.f1 = 1; delay_ms(25); PORTB.f1 = 0; PORTB.f3 = 1; delay_ms(25); PORTB.f3 = 0; PORTB.f4 = 1; delay_ms(25); PORTB.f4 = 0; } PORTB.f1 = 1;

Page 131: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 131

while(1) { configure_transmitter(); transmit_data(); PORTB.f5 = 1 ; configure_receiver(); delay_ms(50); if(PORTB.f0 == 1) { receive_data(); PORTB.f5 = 0 ; if ((data_array[0] == 0x12) && (data_array[1] == 0x34) && (data_array[2] == 0xAB) && (data_array[3] == 0xCD)) { if (PORTB.f4 == 1) { PORTB.f4 = 0; PORTB.f1 = 1; } else if (PORTB.f3 == 1) { PORTB.f3 = 0; PORTB.f4 = 1; }

else if (PORTB.f1 == 1) { PORTB.f1 = 0; PORTB.f3 = 1; } } } } }

Test the rf with ultra sonic

int i=0; int x[4]; int j=1; unsigned char data_array[4]; void interrupt() { int i=0;

if (PIR1.ADIF == 1) {

Page 132: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 132

x[j]=((((ADRESL+(ADRESH*256)/1024))*3)*2.54); j++; if (j==3) { j=0; transmit_data(); delay_ms(50); PORTB.f4 = 1; delay_ms(50); PORTB.f4 = 0; } if((ADRESL+(ADRESH*256)) <= 68) { PORTB.f5 = 1; } else { PORTB.f5 = 0; } PIR1.ADIF = 0; INTCON = 0xC0; PIE1 = 0x40; } ADRESL = 0; ADRESH = 0; delay_ms(50); ADCON0.GO = 1; } void main() { INTCON = 0xC0; OPTION_REG = 0X80; PIR1 = 0x00; PIE1 = 0x40; ADCON1 = 0xCE; ADCON0 = 0x01;

TRISA = 0x01; TRISB = 0x00; TRISC = 0x00; TRISD = 0x00; TRISE = 0x00;

PORTA = 0; PORTB = 0; PORTC = 0; PORTD = 0; PORTE = 0; configure_transmitter();

Page 133: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 133

ADCON0.GO = 1; TMR0=0;

while(1); }

Accelerometer angle measurment & gyrometer angular velocity measurement with output on LEDs

double result,iresult; void main() { TRISA = 0;TRISB = 0;TRISC = 0;TRISD = 0; TRISE = 0; PORTA = 0;PORTB = 0;PORTC = 0;PORTD = 0;PORTE = 0; INTCON=0xC0; TRISA=0b00000001; ADCON0 = 0b01000001; ADCON1 = 0b11000000; delay_ms(2000); ADCON0.GO=1; PORTD.f0=1; while(ADCON0.GO==1); ADCON0 = 0x01; iresult=(ADRESH<<8)+ADRESL; PORTD.f0=0; PIE1 = 0x40; while(1); } void interrupt() { if(PIR1.ADIF==1) { PORTD.f1=~PORTD.f1; result=iresult-(ADRESH<<8)-ADRESL; if(result<-1) { PORTC=8; } else if(result>1) { PORTC=2; } else PORTC=1; if(result>10) { PORTC=8+16;

Page 134: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 134

} if(result>33) { PORTC=8+16+32; } if(result>66) { PORTC=8+16+32+64; } if(result<-10) { PORTC=8+4; } if(result<-33) { PORTC=8+4+2; } if(result<-66) { PORTC=8+4+2+1; } ADCON0 = 0b01000001; ADCON1 = 0b11000000; PIR1.ADIF=0; ADCON0.GO=1; } }

Gyrometer angle calculation with integration and sending result through RF.

double result,iresult,reading,treading = 0; unsigned char count = 0; char text[4]; char data_array[4]; int i = 0; void transmit_data2() { unsigned char i, j, temp, rf_address; TRISC = 0b00000000; PORTC.f7 = 1;

delay_ms(1); rf_address = 0b11100111; for(i = 0 ; i < 8 ; i++) { PORTC.f6 = rf_address.f7; PORTC.f5 = 1; PORTC.f5 = 0;

Page 135: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 135

rf_address <<= 1; } for(i = 0 ; i < 4 ; i++) { temp = data_array[i]; for(j = 0 ; j < 8 ; j++) { PORTC.f6 = temp.f7; PORTC.f5 = 1; PORTC.f5 = 0; temp <<= 1; } } PORTC.f7 = 0; } void bootup() { OSCCON=0b01111000; while(OSCCON.f2==0); } void main() { TRISA = 1;TRISB = 0;TRISC = 0;TRISD = 0; TRISE = 0; PORTA = 0;PORTB = 0;PORTC = 0;PORTD = 0; PORTE = 0; bootup(); PORTD.f0=1; delay_ms(1000); configure_transmitter(); PORTD.f0=0; delay_ms(3000); data_array[0]='T'; data_array[1]='E'; data_array[2]='S'; data_array[3]='T'; transmit_data2(); delay_ms(1000); data_array[0]='1'; data_array[1]='2'; data_array[2]='3'; data_array[3]='4'; transmit_data2(); delay_ms(1000); data_array[0]='A'; data_array[1]='P'; data_array[2]='R'; data_array[3]='2'; transmit_data2(); delay_ms(1000); INTCON=0xC0;

Page 136: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 136

TRISA=0b00000001; ADCON0 = 0b01000001; ADCON1 = 0b11000000; ADCON2 = 0b00101000; delay_ms(3000); ADCON0.GO=1; while(ADCON0.GO==1); iresult=(ADRESH<<8)+ADRESL; PIR1.ADIF=0; PIE1 = 0x40; ADCON0.GO=1; while(1); } void interrupt() { if(PIR1.ADIF==1) { reading=(ADRESH<<8)+ADRESL-iresult; treading+=reading; i++; if(i==400) { treading/=400; i=0; if(treading<-2) result+=treading*0.266308593; if(treading>2) result+=treading*0.266036; reading=result; for(count=0;count<3;count++) { text[2-count]='0'+(char)reading%10; reading/=10; } data_array[1]=text[0]; data_array[2]=text[1]; data_array[3]=text[2]; if(result<0) data_array[0]='-'; else data_array[0]='+'; transmit_data(); } PIR1.ADIF=0; ADCON0.GO=1; } }

Page 137: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 137

SPI with gyro angle calculation with integration & sending through RF.

Master #include "constants.h"

double xGyro,yGyro,IxGyro,IyGyro,altUltra,xAngle,yAngle,temp; char i = 0, count = 0; void bootup() { OSCCON=0b01111000; while(OSCCON.f2==0); } void initialize_ports() { TRISA=0x3F; TRISE=0x07; TRISB=TRISC=TRISD=0; PORTB=PORTC=PORTD=0; } void initialize_spi_master() { TRISC.f4=1; SSPSTAT=0b01000000; SSPCON=0b00100000; } void debugging_code() { PORTC.f6=1; PORTC.f7=0; delay_ms(5000); PORTC.f7=1; PORTC.f6=0; } void setup_adc() { ADCON0=0b01100001; ADCON1=0xC2; ADCON2=0b00101000; } void get_initial_values() { ADCON0.GO=1; while(ADCON0.GO==1); IxGyro=(ADRESH<<8)+ADRESL; ADCON0=0b01011001; ADCON0.GO=1; while(ADCON0.GO==1);

Page 138: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 138

IyGyro=(ADRESH<<8)+ADRESL; ADCON0=0b01100001; } void set_interrupts() { INTCON=0xC0; OPTION_REG=0b10000010; PIR1.ADIF=0; PIE1.ADIE=1; } void start() { ADCON0.GO=1; } void init_pwm() { SSPBUF=INIT_PWM; CCP1CON=CCP2CON=CCP3CON=0x0F; CCPR1L=CCPR2L=CCPR3L=0; T2CON=0b00000111; PR2=167; } void increase_front_left() { if(CCPR2L<PR2) CCPR2L++; } void decrease_front_left() { if(CCPR2L>0) CCPR2L--; } void increase_front_right() { SSPBUF=INCREASE_PWM; } void decrease_front_right() { SSPBUF=DECREASE_PWM; } void increase_back_left() { if(CCPR1L<PR2) CCPR1L++; } void decrease_back_left() { if(CCPR1L>0) CCPR1L--;

Page 139: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 139

} void increase_back_right() { if(CCPR3L<PR2) CCPR3L++; } void decrease_back_right() { if(CCPR3L>0) CCPR3L--; } void increase_pwm() { increase_front_right(); increase_front_left(); increase_back_left(); increase_back_right(); } void decrease_pwm() { decrease_front_right(); decrease_front_left(); decrease_back_left(); decrease_back_right(); } void tilt_right() { decrease_front_right(); increase_front_left(); increase_back_left(); decrease_back_right(); } void tilt_left() { increase_front_right(); decrease_front_left(); decrease_back_left(); increase_back_right(); } void tilt_forward() { decrease_front_right(); decrease_front_left(); increase_back_left(); increase_back_right(); } void tilt_backward() { increase_front_right();

Page 140: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 140

increase_front_left(); decrease_back_left(); decrease_back_right(); } void spin_right() { decrease_front_right(); increase_front_left(); decrease_back_left(); increase_back_right(); } void spin_left() { increase_front_right(); decrease_front_left(); increase_back_left(); decrease_back_right(); } void wait_for_transmission() { while(PIR1.SSPIF==0); PIR1.SSPIF=0; } void configure_transmitter() { wait_for_transmission(); SSPBUF=CONFIGURE_TRANSMITTER; } void configure_receiver() { wait_for_transmission(); SSPBUF=CONFIGURE_RECEIVER; } void send_double() { wait_for_transmission(); SSPBUF=DOUBLE_MSG; } void transmit_data(double data) { wait_for_transmission(); SSPBUF=TRANSMIT_DATA; wait_for_transmission(); SSPBUF=data; temp=data/256; wait_for_transmission(); SSPBUF=temp; temp=temp/256; wait_for_transmission();

Page 141: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 141

SSPBUF=temp; temp=temp/256; wait_for_transmission(); SSPBUF=temp; } void transmit_data2(double data) { wait_for_transmission(); SSPBUF=TRANSMIT_DATA; wait_for_transmission(); SSPBUF=data; temp=data/256; wait_for_transmission(); SSPBUF=temp; temp=temp/256; wait_for_transmission(); SSPBUF=temp; temp=temp/256; wait_for_transmission(); SSPBUF=temp; PORTC.f7=1; } void main() { bootup(); initialize_ports(); initialize_spi_master(); setup_adc(); delay_ms(3000); configure_transmitter(); delay_ms(50); temp='T'*256*256*256+'E'*256*256+'S'*256+'T'; transmit_data(temp); delay_ms(1000); temp='1'*256*256*256+'2'*256*256+'3'*256+'4'; transmit_data(temp); delay_ms(1000); temp='A'*256*256*256+'P'*256*256+'R'*256+'2'; transmit_data(temp); delay_ms(1000); init_pwm(); delay_ms(10000); debugging_code(); get_initial_values(); set_interrupts(); start(); while(1); } void interrupt()

Page 142: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 142

{ if(PIR1.ADIF==1) { if(i==0) { xGyro+=(ADRESH<<8)+ADRESL-IxGyro; ADCON0=0b01100001; count++; if(count==400) { count=0; xGyro/=400; if(xGyro>2) xAngle+=xGyro*0.266036; if(xGyro<-2) xAngle+=xGyro*0.266308593; xGyro=0; transmit_data2(xAngle); if(SSPCON.WCOL==1) PORTC.f6=1; } ADCON0.GO=1; i=0; } else if(i==1) { yGyro+=(ADRESH<<8)+ADRESL-IyGyro; ADCON0=0b01110001; if(count==0) { yGyro/=50; if(yGyro<-1) { tilt_forward(); PORTC.f7=0; } if(yGyro>1) { tilt_backward(); PORTC.f7=1; } } ADCON0.GO=1; i=2; TMR0=0; } else if(i==2) { altUltra+=(ADRESH<<8)+ADRESL;

Page 143: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 143

ADCON0=0b01100001; if(count==0) { altUltra/=50; if(altUltra<133) increase_pwm(); if(altUltra>133) decrease_pwm(); xGyro=0; yGyro=0; altUltra=0; } ADCON0.GO=1; i=0; count=(count+1)%50; } PIR1.ADIF=0; } if(INTCON.T0IF==1) { INTCON.T0IF=0; INTCON.T0IE=0; ADCON0.GO=1; } }

Slave #include "constants.h"

unsigned char msg,i = 0; double double_msg; unsigned char data_array[4]; unsigned char bytes = 0; void bootup() { OSCCON=0b01111000; while(OSCCON.f2==0); } void initialize_ports() { PORTA=0; PORTE=0; TRISA=0; TRISE=0; TRISB=TRISC=TRISD=0; PORTB=PORTC=PORTD=0; } void initialize_spi_slave() {

Page 144: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 144

TRISC.f4=1; TRISC.f3=1; SSPSTAT=0b01000000; SSPCON=0b00100101; } void debugging_code() { PORTB.f3=1; PORTB.f5=0; delay_ms(2000); PORTB.f5=1; PORTB.f3=0; } void set_interrupts() { INTCON=0xC0; PIR1.SSPIF=0; PIE1.SSPIE=1; } void init_pwm() { CCP1CON=0x0F; CCPR1L=0; T2CON=0b00000111; PR2=167; } void increase_pwm() { if(CCPR1L<PR2) CCPR1L++; PORTB.f5=1; } void decrease_pwm() { if(CCPR1L>0) CCPR1L--; PORTB.f5=0; } void receive_char() { } void receive_int() { } void receive_double() { PIR1.SSPIF=0; PIE1.SSPIE=0; while(PIR1.SSPIF==0);

Page 145: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 145

PIR1.SSPIF=0; data_array[i]=SSPBUF; double_msg=data_array[i]; i++; while(PIR1.SSPIF==0); PIR1.SSPIF=0; data_array[i]=SSPBUF; double_msg+=data_array[i]*256; i++; while(PIR1.SSPIF==0); PIR1.SSPIF=0; data_array[i]=SSPBUF; double_msg+=data_array[i]*256*256; i++; while(PIR1.SSPIF==0) PIR1.SSPIF=0; data_array[i]=SSPBUF; double_msg+=data_array[i]*256*256*256; i=0; transmit_data(); PIE1.SSPIE=1; } void prepare_transmit_data() { bytes=3; } void interrupt() { if(PIR1.SSPIF==1) { if(bytes==0) { msg=SSPBUF; switch(msg) { case INIT_PWM:init_pwm();break; case INCREASE_PWM:increase_pwm();break; case DECREASE_PWM:decrease_pwm();break; case CONFIGURE_TRANSMITTER:configure_transmitter2();break; case CONFIGURE_RECEIVER:configure_receiver();break; case TRANSMIT_DATA:prepare_transmit_data();break; } } else { data_array[3-bytes]=SSPBUF; bytes--; if(bytes==0) {

Page 146: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 146

if(msg==TRANSMIT_DATA) transmit_data2(); PORTB=0xFF; } } } PIR1.SSPIF=0; } void main() { bootup(); initialize_ports(); ADCON1=0x0F; PORTB=0xFF; delay_ms(1000); configure_transmitter(); delay_ms(1000); PORTB=0; data_array[0]='A'; data_array[1]='L'; data_array[2]='E'; data_array[3]='X'; delay_ms(1000); PORTB=0xFF; transmit_data(); delay_ms(1000); PORTB=0; initialize_spi_slave(); set_interrupts(); debugging_code(); while(1); }

Constants.h #define INIT_PWM 1 #define INCREASE_PWM 2 #define DECREASE_PWM 3 #define CONFIGURE_TRANSMITTER 4 #define CONFIGURE_RECEIVER 5 #define INT_MSG 6 #define CHAR_MSG 7 #define DOUBLE_MSG 8 #define TRANSMIT_DATA 9 #define UP 10 #define DOWN 11 #define SENDING 12 #define IDLE 13 #define WAITING_FOR_ACK 14

Page 147: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 147

PIC PWM with interrupts

Master

unsigned char dir=0; unsigned char msg; void setup_COMM_SEND() { TRISD=0; } void setup_COMM_RECEIVE() { PORTD=0; TRISD=0xFF; } void clock_COMM() { delay_ms(5000); } void hello() { setup_COMM_SEND(); PORTD=0xFF; clock_COMM(); setup_COMM_RECEIVE(); while(PORTD.f7==0); } void receive_ACK() { if(PORTD==0xFF) return; PORTC.f0=1; while(1); } void send_Byte(unsigned char msg) { setup_COMM_SEND(); PORTD=msg; clock_COMM(); setup_COMM_RECEIVE(); while(PORTD.f7==0); if(PORTD==0xFF) return; PORTC.f0=1; while(1); } void setup_PWM() {

Page 148: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 148

send_Byte(SETUP_PWM); T2CON=0b00000111; CCP1CON=0b00001111; CCP2CON=0b00001111; CCPR1L=0; CCPR2L=0; } void setup_COMM() { hello(); receive_ACK(); } void setup_INTERRUPTS() { INTCON=0b11000000; } void setup_ADC() { send_Byte(SETUP_ADC); ADCON0=0b01000001; ADCON1=0b11000001; } void increase_PWM() { send_Byte(INCREASE_PWM); CCPR1L++; CCPR2L++; if(CCPR1L>167) dir=1; } void decrease_PWM() { send_Byte(DECREASE_PWM); CCPR1L--; CCPR2L--; if(CCPR1L==0) dir=UP; } void main() { TRISC=0; setup_INTERRUPTS(); setup_COMM(); setup_PWM(); setup_ADC(); while(1) { delay_ms(500); if(dir==UP)

Page 149: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 149

increase_PWM(); else decrease_PWM(); } }

Slave

unsigned char dir=0; unsigned char msg; void setup_COMM_TRANSMIT() { TRISD=0; TRISB.f0=0; } void setup_COMM_RECEIVE() { TRISD=0xFF; TRISB.f0=1; } void clock_COMM() { delay_ms(2000); } void send_ACK() { setup_COMM_TRANSMIT(); PORTD=0xFF; PORTB.f0=1; clock_COMM(); PORTB.f0=0; PORTD=0; setup_COMM_RECEIVE(); } void receive_Byte() { msg=PORTD|0x80; send_ACK(); } void setup_INTERRUPTS() { INTCON=0b11010000; OPTION_REG=0b10000000; } void setup_COMM() { setup_COMM_RECEIVE(); while(PORTB.f0==0); msg=PORTD|0x80;

Page 150: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 150

if(msg==HELLO) { send_ACK(); return; } PORTC.f0=1; while(1); } void setup_PWM() { T2CON=0b00000111; CCP1CON=0b00001111; CCP2CON=0b00001111; CCPR1L=0; CCPR2L=0; } void setup_ADC() { ADCON0=0b01000001; ADCON1=0b11000001; } void increase_PWM() { CCPR1L++; CCPR2L++; if(CCPR1L>167) dir=1; } void decrease_PWM() { CCPR1L--; CCPR2L--; if(CCPR1L==0) dir=0; } void command() { switch(msg) { case INCREASE_PWM:increase_PWM();break; case DECREASE_PWM:decrease_PWM();break; case SETUP_PWM:setup_PWM();break; case SETUP_ADC:setup_ADC();break; } } void interrupt() { if(INTCON.INTF==1) {

Page 151: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 151

receive_Byte(); command(); INTCON.INTF=0; } } void main() { TRISC=0; setup_COMM(); setup_INTERRUPTS(); while(1); }

Base Station RF receiver code

unsigned char data_array[4],x; void boot_up() { OSCCON = 0b01110000; while(OSCCON.f2 == 0); ANSEL = 0b00000000; CMCON = 0b00000111; PORTA = 0b00000000; TRISA = 0b00111100; PORTB = 0b00000000; TRISB = 0b11000101; } void configure_receiver() { unsigned char i,j; unsigned char config_setup[3], temp; PORTA = 0b00000000; TRISA = 0b00111000; PORTA.f6 = 0; PORTA.f0 = 1; delay_ms(1); config_setup[0] = 0b00000101; config_setup[1] = 0b01001110; config_setup[2] = 0b00100011; for (j = 3; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTA.f2 = config_setup[j-1].f7; PORTA.f1 = 1; PORTA.f1 = 0; config_setup[j-1] <<= 1; } }

Page 152: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 152

PORTA.f6 = 0; PORTA.f0 = 0; PORTA = 0b00000000; TRISA = 0b00111100; delay_ms(1); PORTA.f6 = 1; PORTA.f0 = 0; } void receive_data(void) { unsigned char i, j, temp; PORTA.f6 = 0; data_array[0] = 0x00; data_array[1] = 0x00; data_array[2] = 0x00; data_array[3] = 0x00; for(i = 0 ; i < 4 ; i++) { for(j = 0 ; j < 8 ; j++) { temp <<= 1; temp.f0 = PORTA.f2; PORTA.f1 = 1; PORTA.f1 = 0; } data_array[i] = temp; //Store this byte } if (PORTB.f4 == 1) { PORTB.f4 = 0; PORTB.f1 = 1;

} else if (PORTB.f3 == 1)

{ PORTB.f3 = 0; PORTB.f4 = 1; }

else if (PORTB.f1 == 1) { PORTB.f1 = 0; PORTB.f3 = 1; } } PORTA.f6 = 1; } void send_data_USART() { unsigned char i; for(i=0;i<4;i++) { TXREG=data_array[i];

Page 153: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 153

while(TXSTA.TRMT==0); }

} void stop_receiver() { PORTA.f6=0; } void start_receiver() { PORTA.f6=1; } void main() { TRISA=0; TRISB=0; PORTA=0; PORTB=0; boot_up(); for (x = 0; x < 3; x++) {

PORTB.f1 = 1; delay_ms(25); PORTB.f1 = 0; PORTB.f3 = 1; delay_ms(25); PORTB.f3 = 0; PORTB.f4 = 1; delay_ms(25); PORTB.f4 = 0; } PORTB.f1 = 1; SPBRG = 25; TXSTA = 0b00100010; RCSTA = 0b10010000; configure_receiver(); while(1) { delay_ms(50); if(PORTA.f3==1) { receive_data(); stop_receiver(); send_data_USART(); start_receiver(); } } }

Page 154: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 154

Base Station RF transmitter code V2

unsigned char data_array[4],x,i; void boot_up() { OSCCON = 0b01110000; while(OSCCON.f2 == 0); ANSEL = 0b00000000; CMCON = 0b00000111; PORTA = 0b00000000; TRISA = 0b00111100; PORTB = 0b00000000; TRISB = 0b11000101; } void configure_transmitter(void) { unsigned char i,j; unsigned char config_setup[3], temp; PORTA = 0b00000000; TRISA = 0b00111000; PORTA.f6 = 0; PORTA.f0 = 1; delay_ms(1); config_setup[0] = 0b00000100; config_setup[1] = 0b01001110; config_setup[2] = 0b00100011; for (j = 3; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTA.f2 = config_setup[j-1].f7; PORTA.f1 = 1; PORTA.f1 = 0; config_setup[j-1] <<= 1; } } delay_ms(1); PORTA.f6 = 0; PORTA.f0 = 0; } void configure_transmitter2() { unsigned char i,j; unsigned char config_setup[3], temp; PORTA = 0b00000000; TRISA = 0b00111000; PORTA.f6 = 0; PORTA.f0 = 1; delay_ms(1); config_setup[0] = 0b00000100; config_setup[1] = 0b01001110;

Page 155: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 155

config_setup[2] = 0b00100011; for (j = 3; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTA.f2 = config_setup[j-1].f7; PORTA.f1 = 1; PORTA.f1 = 0; config_setup[j-1] <<= 1; } } delay_ms(1); PORTA.f6 = 0; PORTA.f0 = 0; } void transmit_data(void) { unsigned char i, j, temp, rf_address; PORTA.f6 = 1; delay_ms(1); rf_address = 0b11100111; for(i = 0 ; i < 8 ; i++) { PORTA.f2 = rf_address.f7; PORTA.f1 = 1; PORTA.f1 = 0; rf_address <<= 1; } for(i = 0 ; i < 4 ; i++) { temp = data_array[i]; for(j = 0 ; j < 8 ; j++) { PORTA.f2 = temp.f7; PORTA.f1 = 1; PORTA.f1 = 0; temp <<= 1; } } PORTA.f6 = 0; } void transmit_data2() { unsigned char i, j, temp, rf_address; PORTA.f6 = 1; delay_ms(1); rf_address = 0b11100111; for(i = 0 ; i < 8 ; i++) { PORTA.f2 = rf_address.f7;

Page 156: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 156

PORTA.f1 = 1; PORTA.f1 = 0; rf_address <<= 1; } for(i = 0 ; i < 4 ; i++) { temp = data_array[i]; for(j = 0 ; j < 8 ; j++) { PORTA.f2 = temp.f7; PORTA.f1 = 1; PORTA.f1 = 0; temp <<= 1; } } PORTA.f6 = 0; } void configure_receiver() { unsigned char i,j; unsigned char config_setup[3], temp; PORTA = 0b00000000; TRISA = 0b00111000; PORTA.f6 = 0; PORTA.f0 = 1; delay_ms(1); config_setup[0] = 0b00000101; config_setup[1] = 0b01001110; config_setup[2] = 0b00100011; for (j = 3; j > 0; j--) { for(i = 0 ; i < 8 ; i++) { PORTA.f2 = config_setup[j-1].f7; PORTA.f1 = 1; PORTA.f1 = 0; config_setup[j-1] <<= 1; } } PORTA.f6 = 0; PORTA.f0 = 0; PORTA = 0b00000000; TRISA = 0b00111100; delay_ms(1); PORTA.f6 = 1; PORTA.f0 = 0; } void receive_data(void) { unsigned char i, j, temp; PORTA.f6 = 0; data_array[0] = 0x00;

Page 157: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 157

data_array[1] = 0x00; data_array[2] = 0x00; data_array[3] = 0x00; for(i = 0 ; i < 4 ; i++) { for(j = 0 ; j < 8 ; j++) { temp <<= 1; temp.f0 = PORTA.f2; PORTA.f1 = 1; PORTA.f1 = 0; } data_array[i] = temp; } PORTA.f6 = 1; } void send_data_USART() { unsigned char i; for(i=0;i<4;i++) { TXREG=data_array[i]; while(TXSTA.TRMT==0); }

} void stop_receiver() { PORTA.f6=0; } void start_receiver() { PORTA.f6=1; } void main() { TRISA=0; TRISB=0; PORTA=0; PORTB=0; boot_up(); for (x = 0; x < 3; x++) { PORTB.f1 = 1; delay_ms(25); PORTB.f1 = 0; PORTB.f3 = 1; delay_ms(25); PORTB.f3 = 0;

Page 158: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 158

PORTB.f4 = 1; delay_ms(25); PORTB.f4 = 0; } PORTB.f1 = 1; SPBRG = 25; TXSTA = 0b00100010; RCSTA = 0b10010000; configure_transmitter(); delay_ms(1000); data_array[0]='A'; data_array[1]='L'; data_array[2]='E'; data_array[3]='X'; transmit_data2(); delay_ms(1000); PIR1.RCIF=0; PIE1.RCIE=1; INTCON=0xC0; while(1); } void interrupt() { if(PIR1.RCIF==1) { data_array[i]=RCREG; i=(i+1)%4; if(i==0) { transmit_data(); } } }

SPI PWM code

Master

#include "constants.h" unsigned char dir; void Init_Pwm() { SSPBUF=INIT_PWM; T2CON=0b00000111; CCP1CON=0b00001111; CCP2CON=0b00001111; CCPR1L=0; CCPR2L=0;

Page 159: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 159

PR2=255; dir=UP; } void Increase_Pwm() { SSPBUF=INCREASE_PWM; if(CCPR1L<PR2) CCPR1L++; if(CCPR2L<PR2) CCPR2L++; else dir=DOWN; } void Decrease_Pwm() { SSPBUF=DECREASE_PWM; if(CCPR1L>0) CCPR1L--; if(CCPR2L>0) CCPR2L--; else dir=UP; } void main() { TRISA=0; TRISB=0; TRISC=0; TRISE=0; PORTA=0; PORTB=0; PORTC=0; PORTE=0; TRISC.f4=1; SSPSTAT=0b01000000; SSPCON=0b00100000; TRISD=0; delay_ms(5000); Init_Pwm(); while(1) { if(dir==UP) Increase_Pwm(); else Decrease_Pwm(); delay_ms(10); } }

Page 160: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 160

Slave

#include "constants.h"

unsigned char msg; void main() { TRISA=0; TRISB=0; TRISC=0; TRISE=0; PORTA=0; PORTB=0; PORTC=0; PORTE=0; INTCON=0xC0; TRISC.f3=1; TRISC.f4=1; SSPSTAT=0b01000000; SSPCON=0b00100101; PIE1.SSPIE=1; TRISD=0; PORTD=0; while(1); } void Init_Pwm() { T2CON=0b00000111; CCP1CON=0b00001111; CCP2CON=0b00001111; CCPR1L=0; CCPR2L=0; PR2=255; } void Increase_Pwm() { if(CCPR1L<PR2) CCPR1L++; } void Decrease_Pwm() { if(CCPR1L>0) CCPR1L--; } void interrupt() { if(PIR1.SSPIF==1) { msg=SSPBUF;

Page 161: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 161

if(CCPR1L<50) PORTD=1; else if(CCPR1L<100) PORTD=3; else if(CCPR1L<150) PORTD=7; else if(CCPR1L<200) PORTD=15; else PORTD=31; if(msg==INIT_PWM) init_Pwm(); else if(msg==INCREASE_PWM) Increase_Pwm(); else if(msg==DECREASE_PWM) Decrease_Pwm(); PIR1.SSPIF=0; } }

GPS testing with RF

char *work = "it worked"; unsigned char l=0,discard=0,i=0,gflag=0,count=0,outar[75]; unsigned char check=0,crc1,crc2,crc; int glat=0,glong=0,gvel=0,ghead=0; void main() { INTCON = 0xC0; OPTION_REG = 0x80; TMR0=0; INTCON.T0IE=1;

TRISA=0x00; TRISB=0x00; TRISC=0x80; TRISD=0x00; TRISE=0x00;

PORTA=0; PORTB=0; PORTC=0; PORTD=0; PORTE=0;

while(1); }

void interrupt() { if(count == 0)

Page 162: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 162

{ count++; Lcd8_Config(&PORTB,&PORTD,3,2,0,7,6,5,4,3,2,1,0); Lcd8_Cmd(LCD_CURSOR_OFF); INTCON.T0IE=0; INTCON.T0IF=0; SPBRG = 25; TXSTA = 0x00; RCSTA = 0x90; PIR1 = 0x00; PIE1 = 0x20; } if (PIR1.RCIF==1) { if ((RCSTA.FERR==1)&&(RCSTA.OERR==1)) //ferr & oerr { RCSTA.CREN=0; outar[l]=RCREG; l++; outar[l]=RCREG; discard=1; if ((outar[l-1]==0x0D)||(outar[l]==0x0A)) gflag=1; else if((outar[l-1]=='$')||(outar[l]=='P')) l=0; else l++; RCSTA.CREN=1; } else if ((RCSTA.FERR==1)&&(RCSTA.OERR==0)) //ferr only { discard=1; outar[l]=RCREG; if ((outar[l-1]==0x0D)||(outar[l]==0x0A)) gflag=1; else if((outar[l-1]=='$')&&(l>1)) l=0; else l++; } else if ((RCSTA.FERR==0)&&(RCSTA.OERR==1)) //oerr only { RCSTA.CREN=0; outar[l]=RCREG; l++; outar[l]=RCREG; if((outar[l-1]=='$')&&(l>1)) {discard=0; outar[0]='$'; outar[1]='P';l=2;} if (outar[l]==0x0A) gflag=1; //gflag=1 msg done from 0-L else l++; RCSTA.CREN=1; } else if((RCSTA.FERR!=1)&&(RCSTA.OERR!=1)) //byte finished { outar[l]=RCREG;

Page 163: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 163

if((outar[l]=='$')&&(l>0)) {discard=0; outar[0]='$'; l=1;} if (outar[l]==0x0A) gflag=1; else l++; } if((gflag==1)&&(discard==0)) { if (outar[18]!='A') discard=1; else if(outar[18]=='A') { gflag=0; for(i=1;i<=l-5;i++) //crc checker check^=outar[i]; //check crc if valid start flight if (outar[l-3]>='A') crc1=outar[l-3]-'A'+10; else crc1=outar[l-3]-'0'; if (outar[l-2]>='A') crc2=outar[l-2]-'A'+10; else crc2=outar[l-2]-'0'; crc=(crc1<<4)+crc2;

glat=(outar[25]/10)+(outar[26]/100)+(outar[27]/1000)+(outar[28]/10000); glong=(outar[38]/10)+(outar[39]/100)+(outar[40]/1000)+(outar[41]/10000); l=0; if (outar[49]==',') { gvel=outar[48]*(10*outar[47])+(100*outar[45]); if (outar[54]==',') ghead=(10*outar[50])+outar[52]; else if(outar[55]==',')

ghead=(100*outar[50])+(10*outar[51])+outar[53]; else if (outar[56]==',') ghead=(1000*outar[50])+(100*outar[51])+(10*outar[52])+outar[54];

} if (outar[50]==',') { gvel=outar[49]*(10*outar[48])+(100*outar[46])+(1000*outar[45]); if (outar[54]==',') ghead=(10*outar[51])+outar[53]; else if(outar[55]==',') ghead=(100*outar[51])+(10*outar[52])+outar[54]; else if (outar[56]==',') ghead=(1000*outar[51])+(100*outar[52])+(10*outar[53])+outar[55]; } Lcd8_Out(1,1,work);

Page 164: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 164

} } else if((discard==1)&&(gflag==1)) { l=0; discard=0; gflag=0; } PIR1.RCIF = 0; PIR1.RCIE = 0; PIR1.RCIE = 1; RCSTA = 0x90; INTCON = 0xC0; } INTCON = 0xC0; }

Page 165: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 165

APPENDIX C : WEIGHT & THRUST

CHARTS

WEIGHT CHART

COMPONENT QUANTITY WEIGHT (g)

1st Wood Chassis 1 197

2nd Wood Chassis 1 93

3rd Wood Chassis 1 47.5

Carbon-Fiber Chassis 1 43.5

Battery (Li-Poly) 1 326

Battery (9V) 1 35g

Motor 4 284

Sync 4 36

Metal struts and screws 1 107

Camera 1 63

PIC 1 27

Gyrometer 2 2

Accelerometer 1 2

RF transceiver 1 4

GPS 1 15

Ultrasonic sensor 5 30

The Brain PCB bare (old) 1 34

Motor Driver with components (old) 4 68

UAV (Config2) 1 1107g

Brain(New) 1 190g

UAV (All components, carbon-fiber) 1 990g

Page 166: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 166

THRUST CHART

GW/EPS-350C-CS

Volts Amps Thrust Efficiency PROPELLER

(V) (A) (g) (oz) Power (w)

(g/w) (oz/kw)

EP1047 6 6.5 300 10.50 39.00 7.69 269

EP1047 7.2 8.8 410 14.35 63.36 6.47 226

EP1047 8.4 10.3 470 16.45 86.52 5.43 190

EP1047 9.6 12.8 540 18.90 122.88 4.39 154

*Note: Last row shouldn t be tested, prolonged exposure to high voltage can irreversibly

damage your motors.

Page 167: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 167

APPENDIX D : LITHIUM POLYMER

BATERY CARE

Components involved with battery care include the following; Astro Flight 109D

lithium charger/discharger with dean s connectors, the 120 power supply rated at 13.5V,

106 Blinky battery balancer, and the 549 blinky to thunder power adapter. The battery was

a thunder power model with dean s connectors, while some other batteries use an astro

connector. The 101D wattmeter with dean s connector is a useful tool to always know how

much current the battery is releasing. Pictures of these products can be seen in section 4.4

Major Components. All of these products were obtained from www.astroflight.com.

Configuration is as follows, the power supply Vin connects regularly to a

110V/220V source. Vout terminals connect to the Charger/Discharger with alligator clips.

The Dean s connector of the charger connects to the dean s connector of the battery. The

blinky battery balancer connects to the adapter that connects to the balancer battery input.

The two line display indicates the status of the charging sequence in six messages

shows (in order of left-right) shown in the figure below. Charge current (0.10A), number of

cells (2C), charge mode (2, following 2C in the second field), battery voltage (6.93V),

charge duration (3:05:52), and number of milliamp hours of charge (0.26AH) to put into

battery pack.

Page 168: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 168

For the first 3 minutes the battery will be charging in mode 1, even if the battery is

full, therefore do not charge a fully charged battery, it can overcharge and damage the cells.

After those 3 minutes, the mode switches to 2. The charger has a current adjust knob

labeled Amps Adjust on the front panel (as shown in figure). Charging current can be

adjusted from 50mA to 8A. Always start the current adjust at 0A and gradually increase

charging rate until the charge equals battery capacity (1C rate, at 1C the battery pack should

charge in 1 hour, charging at a higher rate can burn the battery). In this case that would be

8A considering the battery is an 8000mA/hr pack. After a few minutes the charging current

decreases slightly as the battery voltage rises, so raising the current can be done if desired.

At 85% battery capacity the charger will switch to mode 3. In mode 3 charging current is

turned on and off periodically until the resting voltage of each cell is 4.2V. When the

charger detects fully charged condition which is at 4.2V per cell (the battery is a 2 cell unit

meaning full charge is at 8.4V), charging stops automatically. The display will then indicate

highest resting voltage reached and number of mA/hr put into the battery since last charge.

Caution should be taken to never let the battery drop below 3.2V per cell, the

battery pack should be disconnected and charged immediately. Should the voltage fall

below that the battery should be charged at a rate between 5% and 10% of rated of cell

rated mA/hr capacity. If the voltage falls below 2.5V per cell, the battery will suffer

irreversible chemical damage, and will slowly and completely deteriorate in 30 days.

Page 169: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 169

APPENDIX E: ICSP PROGRAMMING

ICSP (In Circuit Serial Programming) allows developers to manufacture boards

with unprogrammed devices and program them while in the circuit. This is simply done

with two lines for CLK and DATA, and three other limes for POWER GND and

programming voltage. Your programmer must support ICSP to use this function. The MCU

must have this option listed in its special features. The power line is connected to VDD the

GND is connected to VSS the programming voltage is connected to the MCLR, the clock is

connected to RB6 and the DATA I/O is connected to RB7. Special attention must be paid

to implement switches to isolate the circuit from the MCU during programming.

Page 170: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 170

APPENDIX F: REFERENCES

Programs used in this project

- PIC Simulator IDE v6.34 (Testing and simulating)

- MP Lab v7.42 (PIC programmer)

- EAGLE 4.16r1 (PCB Design)

- Mikro Elektronica's MikroC (PIC code editor)

- JCreator LE (Java Code editor)

- WINPIC800 (PIC programmer)

- SiRF Demo PC GPS Utility v3.83 (GPS initializer)

- AutoCAD 2006 (Chassis drawings)

- Google Earth (GPS aid)

Datasheets & referenced websites

- NMEA Reference Manual

http://www.sparkfun.com/datasheets/GPS/NMEA%20Reference%20Manual1.pdf

- EM406 GPS Receiver Datasheet

www.sparkfun.com/datasheets/GPS/EM-406%20Product_Guide1.pdf

ADXL330 Accelerometer Datasheet

http://www.sparkfun.com/datasheets/Components/ADXL330_0.pdf

- IDG300 Gyrometer Datasheet

http://www.sparkfun.com/datasheets/Components/IDG-300_Datasheet.pdf

- 2SD1062 Transistor Datasheet

http://www.ortodoxism.ro/datasheets/mospec/2SD1062.pdf

- Max Sonar EZ1 Ultrasonic Sensor Datasheet

http://www.maxbotix.com/uploads/MaxSonar-EZ1-Datasheet.pdf

Page 171: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 171

- RF-24G Transceiver Datasheet

http://www.sparkfun.com/datasheets/RF/RF-24G_datasheet.pdf

- nRF2401 Datasheet

http://www.sparkfun.com/datasheets/RF/nRF2401rev1_1.pdf

- TIP120 Transistor Datasheet

http://www.ortodoxism.ro/datasheets/fairchild/TIP120.pdf

- WS-309AS Camera Datasheet

http://www.nodactechnology.com/nuevo_sitio/catalog/images/docs/OCB-WS-309AS.pdf

- PC817 Optocoupler Datasheet

http://www.ortodoxism.ro/datasheets/Sharp/mXqyrss.pdf

- MikroC Manual

http://www.mikroe.com/pdf/mikroc/mikroc_manual.pdf

- 16F777, 16LF77 PIC s Datasheet

http://ww1.microchip.com/downloads/en/DeviceDoc/30498c.pdf

-18F4431 PIC Datasheet

http://ww1.microchip.com/downloads/en/DeviceDoc/39616b.pdf

-16F877, 16LF877 PIC s Datasheet

http://ww1.microchip.com/downloads/en/DeviceDoc/30292c.pdf

-16F877A PIC Datasheet

http://ww1.microchip.com/downloads/en/DeviceDoc/39582b.pdf

-74LS126A Quad Tri-State Buffer Datasheet

http://www.tranzistoare.ro/datasheets2/97/97398_1.pdf

-HD447H0U LCD Datasheet

http://web.mit.edu/6.115/www/datasheets/44780.pdf

Page 172: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 172

-2N2222 Transistor Datasheet

http://www.ortodoxism.ro/datasheets/MicroElectronics/mXrurvs.pdf

-16/20 Key Encoder Datasheet

http://www.ortodoxism.ro/datasheets2/b/0dciii4xatog1g559sk4ahd595wy.pdf

-Olimex Programmer Datasheet

http://www.olimex.com/dev/pdf/pic-mcp-c.pdf

- Astro Flight Inc

www.astroflight.com

Latitude/Longitude table

http://home.online.no/~sigurdhu/Grid_1deg.htm

Page 173: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 173

APPENDIX G : BIBLIOGRAPHY PID vs LQ Control techniques applied to an indoor micro quadrotor

http://asl.epfl.ch/aslInternalWeb/ASL/publications/uploadedFiles/330.pdf

Design Of A Four Rotor Hovering Vehicle

ecommons.library.cornell.edu/bitstream/1813/93/2/Designof4RotHoverVehicle.pdf

Quad-rotor Unmanned Aerial Vehicle

http://www.me.columbia.edu/seniordesigns/2007/QUAVe/FinalReport.pdf

GPS at Wikipedia.com

http://en.wikipedia.org/wiki/Global_Positioning_System

NMEA 0183 GPS Communication Protocol

http://www.homebuilt.org/tech/nmea.html

GWS-EPS-350C Motors

http://www.gws.com.tw/english/product/powersystem/eps350c.htm

GPS Time

http://www.csgnetwork.com/gpstimeconv.html

GPS Calendar

http://www.ngs.noaa.gov/CORS/Gpscal.html

Page 174: Unmanned Aerial Vehicle

Unmanned Aerial Vehicle

Page 174

A PDF version of this documentation can be found at:

www.APR2.tk