고프로로 촬영하여 그런지, 왜곡이 상당하네요 ^^;

 

랩 타임이 나오도록 8-digit 모듈을 하나 더 얹으려고 했는데, 다른 재미난 것을 만드느라 정신이 없군요.

재미난 것을 만들다가 한계가 오면 다시 업데이트 하도록 하겠습니다.

 

아! SLI 다음 프로젝트로는 VR 오락실에 가면 만날 수 있는 모션 체어를 만드려고 해요.

리얼리티한 레이싱 게임을 위해 모터를 사용하여 차량의 서스펜션 상태에 따라 의자를 흔드는거죠.

과연 잘 완성할 수 있을지 모르겠네요.

 

 

SLI를 만들기 위해서 MAX7219 제어 방법이 궁금하다면?

2018/03/16 - [코딩/Raspberry PI] - Raspberry Pi에서 MAX7219 제어하기

 

 

동영상에서 동작한 SLI 메인 코드를 올려드려요!

 

main.cpp

 

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
180
181
182
183
184
185
186
187
#include <stdio.h>
#include <string.h>
#include <signal.h>
#include <stdlib.h>
 
#include <unistd.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <arpa/inet.h>
 
#include <wiringPi.h>
 
#include "max7219.h"
#include "SMS_UDP_Definitions.hpp"
 
int sockfd_udp_cli;
 
void intHandler(int dummy)
{
    close(sockfd_udp_cli);
    send_MAX7219(SHUTDOWN, 00);
    exit(0);
}
 
int main(int argc, char** argv)
{
    signal(SIGINT, intHandler);
    
    if( wiringPiSetup() < )
    {
        return 1;
    }
    
    puts("\nLocoField SLI\n");
 
    char udp_recvbuff[SMS_UDP_MAX_PACKETSIZE];
    PacketBase packetHeader;
    memset(&packetHeader, 0sizeof(packetHeader));
 
    sockfd_udp_cli = socket(AF_INET, SOCK_DGRAM, 0);
    if( sockfd_udp_cli < )
    {
        puts("ERROR: create socket.\n");
        return 1;
    }
    
    //int flags = fcntl(sockfd_udp_cli, F_GETFL, 0);
    //fcntl(sockfd_udp_cli, F_SETFL, flags | O_NONBLOCK);
    
    struct timeval timeout;      
    timeout.tv_sec = 1;
    timeout.tv_usec = 0;
    setsockopt(sockfd_udp_cli, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));
 
    
    sockaddr_in receiver;
    receiver.sin_family = AF_INET;
    receiver.sin_addr.s_addr = INADDR_ANY;
    receiver.sin_port = htons(SMS_UDP_PORT);
 
    int retval = bind(sockfd_udp_cli, (sockaddr*&receiver, sizeof(receiver));
    if( retval < )
    {
        puts("ERROR: bind socket.\n");
        return 1;
    }
    
    
    pinMode(DATA, OUTPUT);
    pinMode(CLOCK, OUTPUT);
    pinMode(LOAD, OUTPUT);
 
    send_MAX7219(SCAN_LIMIT, 77);
    send_MAX7219(DECODE_MODE, 00);
    send_MAX7219(INTENSITY, 88);
    send_MAX7219(SHUTDOWN, 11);
    
    int digit_table[11= { 12648109121519195114127123};
    int dot_table[9][9=
    { // 128 64 32 16 8 4 2 1
    { 000015000}, // N
    { 01111111}, // 1
    { 01511158815}, // 2
    { 01511151115}, // 3
    { 099915111}, // 4
    { 01588151115}, // 5
    { 01588159915}, // 6
    { 015999111}, // 7
    { 000015888}, // R
    };
    
    send_MAX7219(1, digit_table[0], dot_table[0][1]);
    send_MAX7219(2, digit_table[0], dot_table[0][2]);
    send_MAX7219(3, digit_table[0], dot_table[0][3]);
    send_MAX7219(4, digit_table[0], dot_table[0][4]);
    send_MAX7219(5, digit_table[0], dot_table[0][5]);
    send_MAX7219(6, digit_table[0], dot_table[0][6]);
    send_MAX7219(7, digit_table[0], dot_table[0][7]);
    send_MAX7219(8, digit_table[0], dot_table[0][8]);
    
    
    sTelemetryData data1;
    memset(&data1, 0sizeof(data1));
    
    while)
    {
        retval = recvfrom(sockfd_udp_cli, (char*)&udp_recvbuff, sizeof(udp_recvbuff), 0, NULL, 0);    
        if( retval > )
        {
            memcpy(&packetHeader, udp_recvbuff, sizeof(PacketBase));
            switch( packetHeader.mPacketType )
            {
            case eCarPhysics:
            {
                memcpy(&data1, udp_recvbuff, sizeof(data1));
                
                // speed
                int speed = data1.sSpeed / 1000 * 3600;
                int s3 = speed / 100; speed -= s3 * 100;
                int s2 = speed / 10; speed -= s2 * 10;
                int s1 = speed;
                
                // rpm
                int rpm = data1.sRpm;
                int r5 = 10;
                int r4 = rpm / 1000; rpm -= r4 * 1000;
                int r3 = rpm / 100; rpm -= r3 * 100;
                int r2 = rpm / 10; rpm -= r2 * 10;
                int r1 = rpm;
                
                if( r4 >= 10 )
                {
                    r4 -= 10;
                    r5 = 1;
                }
                
                int gear = data1.sGearNumGears;
                int maxGear = gear >> 4;
                int curGear = gear & 15;
                
                if( curGear == 15 // reverse gear;
                    curGear = 8;
                
                float rpm_per = (float) data1.sRpm / data1.sMaxRpm - 0.8;
                int rpmL = 0;
                
                if( rpm_per > )
                    rpmL = rpm_per /= 0.025;
                
                int led[9=
                {
                    0,
                    digit_table[r1],
                    digit_table[r2],
                    digit_table[r3],
                    digit_table[r4],
                    digit_table[r5],
                    digit_table[s1] | 128,
                    digit_table[s2],
                    digit_table[s3],
                };
                
                forint i = 8; i > 0; i-- )
                {
                    int dot = dot_table[curGear][i];
                    
                    if( rpmL != )
                    {
                        dot |= 128;
                        rpmL--;
                    }
                    
                    send_MAX7219(i, led[i], dot);
                }
 
                usleep(1);
            }
            default:
                continue;
            }
        }
    }
 
    intHandler(0);
    return 0;
}
 
cs

 

 

Project Cars 2에서 제공하는 헤더 파일과 위 소스를 포함하는 프로젝트를 압축하여 업로드합니다.

자유롭게 사용하세요!

 

질문도 언제든지 환영입니다.

 

sli.zip

 

'DIY > Project Cars 2' 카테고리의 다른 글

Project Cars 2 SLI 완성!  (0) 2018.05.16
Raspberry Pi에서 Project Cars 2 UDP 데이터 받기  (2) 2018.03.20

+ Recent posts