달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

'작품/무선 GPS 송수신'에 해당되는 글 3

  1. 2016.02.08 무선 송수신기 + GPS + LCD
  2. 2016.02.08 무선송수신모듈 RH447
  3. 2016.02.08 GPS 값을 받아서 LCD제어

다수의 receiver들이 사방에 있으면서 자신의 gps값을 공중으로 전송시킵니다.

또한 center에는 데이터를 받는 하나의 수신 모듈이 있습니다.

 center는 receiver의 gps값을 읽어드립니다.

이 모듈을 컴퓨터와 연결 되어있으며 이 데이터를 컴퓨터가 받은 후 컴퓨터 화면 창에 위치를 찍어줍니다.


receiver는 아두이노에 GPS, LCD, RH447이 연결되어 있습니다.

회로도.pdf


center는 오로지 RH447과 아두이노로만 구성되어 있으며 단순이 값을 읽어들이는 일만 처리합니다.


receiver의 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
#include "SoftwareSerial.h" //wireless trans
#include "TinyGPS.h" //GPS
#include <LiquidCrystal.h> //LCD
 
#define HEMISPHERE_PIN 13
#define GPS_RX_PIN 5
#define GPS_TX_PIN 6
#define USERID 333333
 
SoftwareSerial mySerial(5,6); //wireless trans
TinyGPS gps;//GPS
SoftwareSerial ss(GPS_RX_PIN, GPS_TX_PIN);
LiquidCrystal lcd(12,11,10,9,8,7); //LCD
 
//wireless trans & GPS
long lat, lon;
char buffer_id[7], buffer_lat[13], buffer_lon[13];
int count_trans = 0;
 
//LCD
long display_lat=0, display_lon = 0;
int i = 1;
int count; // ...
int check_gps = 0// !
 
void setup()
{
  Serial.begin(9600);
  mySerial.begin(9600);
  ss.begin(9600);
  lcd.begin(16,2);
  pinMode(HEMISPHERE_PIN, OUTPUT);
  digitalWrite(HEMISPHERE_PIN, LOW);
}
 
void loop()
{
  read_GPS();
 
  
  //make lat and lon to three num
   display_lat = lat%1000;
   display_lon = lon%1000;
        
  //converting number to string
  ltoa(USERID, buffer_id, 10);
  ltoa(lat, buffer_lat, 10);
  ltoa(lon, buffer_lon, 10);
  
  //send GPS value to center
  if(count_trans > 30){  //sending speed
  mySerial.print(buffer_id);
  mySerial.print("i");
  mySerial.print(buffer_lat);
  mySerial.print("t");
  mySerial.print(buffer_lon);
  mySerial.print("n");
  count_trans = 0;
  delay(10); //because of multiple serial comunication
  }
  
  //count_trans++
  count_trans++;
  
  //-----------------------------LCD
  if(display_lat == && display_lon == 0)
    loading();
  else
  {
    print_3num(display_lat, 00);//first line
    if(check_gps > 200// ! time
    print_text('!'30);
    else
    print_text('.'30);
    print_3num(display_lon, 40);
    print_text('/'70);
    print_3num(401);//second line 
    print_text('.'31);
    print_3num(541);
  }
  print_3num(380);
  print_text('/'71);
  print_3num(681);
  delay(10);
  
  //count looop
  count++;
  check_gps++;
  if(count == 25)
  {i++//the number of dot, that is increased by count
   count =0;}
}
 
void print_3num(int n, int p1, int p2)
{
  if(n>99)
  {
    lcd.setCursor(p1, p2);
    lcd.print(n);
  }
  else if(n>9)
  {
    lcd.setCursor(p1, p2);
    lcd.print("0");
    lcd.setCursor(p1+1, p2);
    lcd.print(n);
  }
  else if(n>=0)
  {
    lcd.setCursor(p1, p2);
    lcd.print("00");
    lcd.setCursor(p1+2, p2);
    lcd.print(n);
  }
}
 
void print_text(char a, int p1, int p2)
{
lcd.setCursor(p1, p2);
lcd.write(a);
}
 
void loading(void)
{
  //first line
  lcd.setCursor(0,0);
  lcd.print("Loading");
  print_text('/'70);
    
  //second line  
  lcd.setCursor(01);
  lcd.print(".");
  lcd.setCursor(01);
  print_text('/'71);
  print_3num(681);
  if(i==7)//reset
   {
     lcd.setCursor(01);
     lcd.print(".      ");
     i=1;
   }
   lcd.setCursor(i, 1);//...
   lcd.print(".");
}
 
void read_GPS(void)
{
   while (ss.available())
  {
    int c = ss.read();
    Serial.write(c);
 
    if (gps.encode(c))
    {
     unsigned long fix_age;
     gps.get_position(&lat, &lon, &fix_age);
    if (fix_age == TinyGPS::GPS_INVALID_AGE )
      Serial.println("No fix ever detected!");
    else if (fix_age > 2000)
      Serial.println("Data is getting STALE!");
    else
      Serial.println("Latitude and longitude valid!");
      
     Serial.print("Lat: "); 
     Serial.print(lat);
     Serial.print(" Lon: "); 
     Serial.println(lon);
     
     if (lat < 0)
        digitalWrite(HEMISPHERE_PIN, HIGH);
     else
        digitalWrite(HEMISPHERE_PIN, LOW);
        
         check_gps=0;
         break;
    }
  }
}
 
cs


center의 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
//receive
 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5,6);
 
char char_value = 0, pre_char = 0;
long long_value = 0;
long id_val = 0, lon_val = 0, lat_val = 0;
char lon_char[13= {'0'}, lat_char[13= {'0'};
int nullLoc = 0;
const char id = 'i', lat = 't', lon = 'n';
 
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
 
 
void loop() // 반복
{
  if (mySerial.available())
  {
    char_value = mySerial.read();
   if(isDigit(char_value))
   {
     long_value = (long_value*10)+(char_value - '0');
   }
    else if(char_value == id)
   {
     id_val = long_value;
     long_value = 0;
     Serial.print("<");
     Serial.print(id_val);
     delay(5);
   }
   else if(char_value == lat)
   {
     lat_val = long_value;
     long_value = 0;
     
      //debugging
      //Serial.print("   ,  origin lat:  "); Serial.print(lat_val);
     //converint num to string
     ltoa(lat_val, lat_char, 10);
     //NULL location
     NULL_location(&nullLoc, lat_char);
     //input dot
     inputDOT(nullLoc, lat_char);
     
     Serial.print(",");
     Serial.print(lat_char);
     delay(5);
   }
    else if(char_value == lon)
   {
     if(pre_char != 'o'){
       
     
     lon_val = long_value;
     long_value = 0;
     
     //debugging
     //Serial.print("   ,  origin lon:  "); Serial.print(lon_val);
     //converint num to string
     ltoa(lon_val, lon_char, 10);
     //NULL location
     NULL_location(&nullLoc, lon_char);
     //input dot
     inputDOT(nullLoc, lon_char);
     
     Serial.print(",");
     Serial.print(lon_char);
     Serial.println(">");
     delay(5);
     }
     
     pre_char = 0;
   }
   
   else if(char_value == 'o' || char_value == 'O')
   {
     pre_char = char_value;
     id_val = long_value;
     long_value = 0;
     Serial.print("<");
     Serial.println(id_val);
     delay(5);
   }
  }
}
 
void NULL_location(int * val, char * charPtr)
{
    int count = 0;
 
    while(charPtr[count] != NULL)
        count = count+1;
    
    *val = count;
}
 
void inputDOT(int  val, char * charPtr)
{
    int count = 0;
 
    while(count<6)
    {
        charPtr[val+1-count] = charPtr[val-count];
        count++;
    }
    charPtr[val - 5= '.';
}
 
cs


'작품 > 무선 GPS 송수신' 카테고리의 다른 글

무선송수신모듈 RH447  (0) 2016.02.08
GPS 값을 받아서 LCD제어  (0) 2016.02.08
:
Posted by youjin.A
2016. 2. 8. 03:25

무선송수신모듈 RH447 작품/무선 GPS 송수신2016. 2. 8. 03:25



SubGHz RF Transceiver Module RH433 Cat_Eng(3p).pdf


무선송수신모듈로는 RH447을 썼습니다.

 

첨부된 pdf 파일에서는 위와 같이 연결하였는 데, 저는 아두이노에서 Rx는 5번 Tx는 6번에 연결하였습니다.

그리고 Baud Rate가 19200bps가 아니라 9600으로 설정하여 작동시켰습니다.




다음 코드는 RH447을 이용하여 데이터를 한 쪽은 주고 한 쪽은 받는 간단한 코드 쌍들 입니다.


송신


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//send
 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5,6);
 
char i[] = "1"
 
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() // 반복
{
mySerial.print(i);
delay(100);
i[0]++;
if(i[0> '9')
i[0= '0';
}
cs


수신

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
//receive
 
#include <SoftwareSerial.h>
SoftwareSerial mySerial(5,6);
void setup()
{
Serial.begin(9600);
mySerial.begin(9600);
}
void loop() // 반복
{
  if (mySerial.available())
  {
  char c = mySerial.read();
  Serial.print(c);
  if(c == '9'){
  Serial.println(".....");
   Serial.print("data: ");
  }
  }
}
cs


'작품 > 무선 GPS 송수신' 카테고리의 다른 글

무선 송수신기 + GPS + LCD  (0) 2016.02.08
GPS 값을 받아서 LCD제어  (0) 2016.02.08
:
Posted by youjin.A
2016. 2. 8. 03:18

GPS 값을 받아서 LCD제어 작품/무선 GPS 송수신2016. 2. 8. 03:18

아두이노로 GPS의 값을 받아서 LCD로 이 값을 나타내는 것을 해보았습니다.

1. 우선 작품에 쓸 LCD 테스트 코드이구요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <LiquidCrystal.h>
 
// LCD
LiquidCrystal lcd(12,11,10,9,8,7);
 
void setup()
{
  lcd.begin(16,2);
}
 
void loop()
{
  print_3num(100);
  print_text('.'30);
 
  print_3num(240);
  print_text('/'70);
  
  print_3num(380);
  
 
  print_3num(401);
  print_text('.'31);
  
  print_3num(541);
  print_text('/'71);
  
  print_3num(681);
}
 
void print_3num(int n, int p1, int p2)
{
  if(n>99)
  {
    lcd.setCursor(p1, p2);
    lcd.print(n);
  }
  else if(n>9)
  {
    lcd.setCursor(p1, p2);
    lcd.print("0");
    lcd.setCursor(p1+1, p2);
    lcd.print(n);
  }
  else if(n>=0)
  {
    lcd.setCursor(p1, p2);
    lcd.print("00");
    lcd.setCursor(p1+2, p2);
    lcd.print(n);
  }
}
 
void print_text(char a, int p1, int p2)
{
lcd.setCursor(p1, p2);
lcd.write(a);
}
cs

2. 다음은 아두이노가 GPS값을 읽어내는 코드입니다.

 gps_datasheet.pdf

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "TinyGPS.h"
#include "SoftwareSerial.h"
 
#define HEMISPHERE_PIN 13
#define GPS_RX_PIN 5
#define GPS_TX_PIN 6
 
TinyGPS gps;
SoftwareSerial ss(GPS_RX_PIN, GPS_TX_PIN);
 
void setup()
{
  Serial.begin(9600);
  ss.begin(9600);
  pinMode(HEMISPHERE_PIN, OUTPUT);
  digitalWrite(HEMISPHERE_PIN, LOW);
}
void loop()
{
  while (ss.available())
  {
    int c = ss.read();
    Serial.write(c);
 
    if (gps.encode(c))
    {
      long lat, lon;
     unsigned long fix_age;
    gps.get_position(&lat, &lon, &fix_age);
    if (fix_age == TinyGPS::GPS_INVALID_AGE )
      Serial.println("No fix ever detected!");
    else if (fix_age > 2000)
      Serial.println("Data is getting STALE!");
    else
      Serial.println("Latitude and longitude valid!");
      
      Serial.print("Lat: "); 
      Serial.print(lat);
      Serial.print(" Lon: "); 
      Serial.println(lon);
      if (lat < 0)
        digitalWrite(HEMISPHERE_PIN, HIGH);
      else
        digitalWrite(HEMISPHERE_PIN, LOW);
    }
  }
}
cs

3. 이 두 코드를 합쳐서 LCD에 나타내야 되는데요. 
여기서 문제는 초반에 GPS 값을 못 읽어 들였을 때는 Loading 이라는 문구와 처리 중이라는 영상이 나오도록 하는 것이였 습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
//LCD
#include <LiquidCrystal.h>
//GPS
#include "TinyGPS.h"
#include "SoftwareSerial.h"
#define HEMISPHERE_PIN 13
#define GPS_RX_PIN 5
#define GPS_TX_PIN 6
 
//LCD
LiquidCrystal lcd(12,11,10,9,8,7);
//GPS
TinyGPS gps; 
SoftwareSerial ss(GPS_RX_PIN, GPS_TX_PIN);
long lat=0, lon=0;
int i = 1;
int count; // ...
int check_gps = 0// !
 
void setup()
{
  //LCD
  lcd.begin(16,2);
  //GPS
  Serial.begin(9600); 
  ss.begin(9600);
  pinMode(HEMISPHERE_PIN, OUTPUT);
  digitalWrite(HEMISPHERE_PIN, LOW);
}
 
void loop()
{
  //GPS
  while (ss.available())
  {
    int c = ss.read();
    Serial.write(c);
    if (gps.encode(c))
    {
     unsigned long fix_age;
     gps.get_position(&lat, &lon, &fix_age);
    lat = (lat % 100000* 60;//calculate lat, lon
    lat = (lat % 100000/ 100;
    lon = (lon %100000* 60;
    lon = (lon %100000/ 100;
    
    check_gps=0;
    break;
    }
  }
  
  //LCD
  if(lat == && lon == 0)
    loading();
  else
  {
    print_3num(lat, 00);//first line
    if(check_gps > 400// ! time
    print_text('!'30);
    else
    print_text('.'30);
    print_3num(lon, 40);
    print_text('/'70);
    print_3num(401);//second line 
    print_text('.'31);
    print_3num(541);
  }
  print_3num(380);
  print_text('/'71);
  print_3num(681);
  
  //count looop
  count++;
  check_gps++;
  if(count == 25)
  {i++;
   count =0;}
}
 
void print_3num(int n, int p1, int p2)
{
  if(n>99)
  {
    lcd.setCursor(p1, p2);
    lcd.print(n);
  }
  else if(n>9)
  {
    lcd.setCursor(p1, p2);
    lcd.print("0");
    lcd.setCursor(p1+1, p2);
    lcd.print(n);
  }
  else if(n>=0)
  {
    lcd.setCursor(p1, p2);
    lcd.print("00");
    lcd.setCursor(p1+2, p2);
    lcd.print(n);
  }
}
 
void print_text(char a, int p1, int p2)
{
lcd.setCursor(p1, p2);
lcd.write(a);
}
 
void loading(void)
{
  //first line
  lcd.setCursor(0,0);
  lcd.print("Loading");
  print_text('/'70);
    
  //second line  
  lcd.setCursor(01);
  lcd.print(".");
  lcd.setCursor(01);
  print_text('/'71);
  print_3num(681);
  if(i==7)//reset
   {
     lcd.setCursor(01);
     lcd.print(".      ");
     i=1;
   }
   lcd.setCursor(i, 1);//...
   lcd.print(".");
}
cs


'작품 > 무선 GPS 송수신' 카테고리의 다른 글

무선 송수신기 + GPS + LCD  (0) 2016.02.08
무선송수신모듈 RH447  (0) 2016.02.08
:
Posted by youjin.A