[Soildworks] Selection Set

CAD 2020. 10. 14. 14:16 |
반응형

Simulation을 진행 할 때 파트의 면을 많이 선택해야 하는 경우 매번 일일이 지정하기는 어렵다. 미리 선택된 면을 세트로 만들어 두자.


육면체의 파트가 있다.


2개의 면을 Selection Set로 만들고 싶다.


마우스 오른쪽 클릭 - Save Selection 선택


파트 트리를 확인하면 Selection Sets가 만들어졌다. 여러개의 Selection Set를 미리 생성해 둘 수 있다.


반응형
Posted by J-sean
:
반응형

광학 문자 인식(Optical Character Recognition; OCR)은 사람이 쓰거나 기계로 인쇄한 문자의 영상이나 이미지를 기계가 읽을 수 있는 문자로 변환하는 것이다. 다양한 운영체제를 위한 광학 문자 인식 엔진 Tesseract를 윈도우즈에서 사용해 보자.


Tesseract Windows version을 제공하는 UB Mannheim에 접속해서 적당한 플랫폼의 Tesseract를 다운 받는다.


설치한다.







Additional language data (download)를 클릭한다.


Korean을 선택한다.











Python-tesseract(pytesseract)를 설치한다. Python-tesseract은 Google의 Tesseract-OCR Engine의 wrapper이다.


영문 이미지를 준비한다.



한글 이미지를 준비한다.


1
2
3
4
5
6
7
from PIL import Image
import pytesseract
 
pytesseract.pytesseract.tesseract_cmd = r'D:\Program Files\Tesseract-OCR\tesseract'
 
print(pytesseract.image_to_string(Image.open('English.png')))
#print(pytesseract.image_to_string(Image.open('Korean.png'), lang = 'kor'))


영문, 한글 이미지를 읽고 텍스트를 출력한다.


영문 이미지 결과.


한글 이미지 결과.



Console에서 아래 명령어로도 같은 결과를 얻을 수 있다.

tesseract English.png stdout


tesseract Korean.png stdout -l kor


stdout이 아닌 다른 이름으로 출력을 지정하면 그 이름의 텍스트 파일로 출력된다.

tesseract English.png result


반응형

'AI, ML, DL' 카테고리의 다른 글

[Scraping] 환율 정보를 SMS로 보내기  (3) 2024.01.02
[Scraping] 환율 정보  (0) 2024.01.02
CSV 분석  (0) 2019.01.20
JSON 분석  (0) 2019.01.18
Beautifulsoup XML 분석  (0) 2019.01.15
Posted by J-sean
:
반응형

숫자(1~99,999)와 디스플레이 크기(1~10) s를 입력하면 [(2s+3)행 X (s+2)열] 크기의 디지털 숫자로 표시하는 프로그램을 만들어 보자. 각 숫자 사이에는 1줄의 공백이 있다.


숫자 5,238을 s=1의 크기로 표시한 예.


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
#include <iostream>
 
using namespace std;
 
int main()
{
    const int MAX_DIGIT = 5;
    const int MAX_SCALE = 10;
 
    char hor_bar[2][MAX_SCALE + 1= { {"          "}, {"----------"} };
    char ver_bar[2][2= { {" "}, {"|"} };
 
    char hor_dig[10][3= { {101}, {000}, {111}, {111}, {010},
        {111}, {111}, {100}, {111}, {111} };    // 0~9
    char ver_dig[10][4= { {1111}, {0101}, {0110}, {0101}, {1101},
        {1001}, {1011}, {0101}, {1111}, {1101} };    // 0~9
    //  -
    // | |
    //  -
    // | |
    //  -
    // 1 digit = 가로선 3개(3줄), 세로선 4개(2줄)
    //             최소 5행 3열
 
    char digits[5][(MAX_SCALE + 3* MAX_DIGIT] = { '\0', };    // 각 숫자 사이에 빈칸 + 마지막 개행 문자 = MAX_SCALE + 3.
                                                                // null문자 '\0'으로 초기화.
    char number[MAX_DIGIT + 1];
    cout << "Enter number(1~99,999): ";
    cin >> number;
 
    int scale;
    cout << "Enter scale(1~10): ";
    cin >> scale;
 
    // scale에 맞게 가로선 길이 조정.
    hor_bar[0][scale] = '\0';
    hor_bar[1][scale] = '\0';
 
    int count_number = strlen(number);
 
    for (int i = 0; i < count_number; i++)
    {
        int real_number = number[i] - '0';    // 문자를 숫자로 변환.
 
        // 두 번째 숫자부터 각 숫자마다 빈 칸 삽입.
        if (i > 0)
            for (int j = 0; j < 5; j++)
                strcat_s(digits[j], sizeof(digits[j]), " ");
 
        // 첫 번째 줄 삽입.
        strcat_s(digits[0], sizeof(digits[0]), " ");
        strcat_s(digits[0], sizeof(digits[0]), hor_bar[hor_dig[real_number][0]]);
        strcat_s(digits[0], sizeof(digits[0]), " ");
 
        // 두 번째 줄 삽입.
        strcat_s(digits[1], sizeof(digits[1]), ver_bar[ver_dig[real_number][0]]);
        strcat_s(digits[1], sizeof(digits[1]), hor_bar[0]);
        strcat_s(digits[1], sizeof(digits[1]), ver_bar[ver_dig[real_number][1]]);
 
        // 세 번째 줄 삽입.
        strcat_s(digits[2], sizeof(digits[2]), " ");
        strcat_s(digits[2], sizeof(digits[2]), hor_bar[hor_dig[real_number][1]]);
        strcat_s(digits[2], sizeof(digits[2]), " ");
 
        // 네 번째 줄 삽입.
        strcat_s(digits[3], sizeof(digits[3]), ver_bar[ver_dig[real_number][2]]);
        strcat_s(digits[3], sizeof(digits[3]), hor_bar[0]);
        strcat_s(digits[3], sizeof(digits[3]), ver_bar[ver_dig[real_number][3]]);
 
        // 다섯 번째 줄 삽입.
        strcat_s(digits[4], sizeof(digits[4]), " ");
        strcat_s(digits[4], sizeof(digits[4]), hor_bar[hor_dig[real_number][2]]);
        strcat_s(digits[4], sizeof(digits[4]), " ");
    }
 
    // 첫 번째 줄 출력
    cout << digits[0<< endl;
 
    // 두 번째 줄 출력
    for (int i = 0; i < scale; i++)
        cout << digits[1<< endl;
 
    // 세 번째 줄 출력
    cout << digits[2<< endl;
 
    // 네 번째 줄 출력
    for (int i = 0; i < scale; i++)
        cout << digits[3<< endl;
 
    // 다섯 번째 줄 출력
    cout << digits[4<< endl;
 
    return 0;
}


잘못된 입력에 대한 처리는 생략되어 있다.


실행 결과.



반응형
Posted by J-sean
:
반응형


지뢰 찾기는 MXN 크기의 지뢰밭에서 모든 지뢰의 위치를 찾는 게임이다. 이 게임의 각 셀은 인접한 최대 8개의 셀 중 몇 개의 셀에 지뢰가 있는지 보여준다.


아래와 같이 맵의 크기를 입력하고 지뢰의 위치를 #로 입력하면 게임 맵을 작성해 주는 프로그램을 만들어 보자.



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
#include <iostream>
 
using namespace std;
 
int main()
{
    int row, column;
 
    cout << "Enter minefield size(row column): ";
    cin >> row >> column;
 
    char** field = new char* [row];
    for (int i = 0; i < row; i++)
    {
        field[i] = new char[column];
        //memset(field[i], 0, sizeof(char) * (column));
    }
 
    char line[100];
 
    cout << "Enter minefield(# = mine): " << endl;
    for (int i = 0; i < row; i++)
    {
        cin >> line;        
        memcpy_s(field[i], column, line, strlen(line) > (unsigned)column ? column : strlen(line));
        // Invalid input prevention.
    }
 
    char** map = new char* [row];
    for (int i = 0; i < row; i++)
    {
        map[i] = new char[column];
        memset(map[i], '0'sizeof(char* (column));
    }
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            if (field[i][j] == '#')
            {
                map[i][j] = '#';
            }
            else
            {
                for (int k = i - 1; k < i + 2; k++)
                    for (int l = j - 1; l < j + 2; l++)
                        if (k > -1 && k < row && l > -1 && l < column && field[k][l] == '#')
                            map[i][j]++;
            }
        }
    }
 
    cout << endl << endl << "Minefield map: " << endl;
 
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < column; j++)
        {
            cout << map[i][j] << ' ';
        }
        cout << endl;
    }
 
    for (int i = 0; i < row; i++)
    {
        delete[] field[i];
    }
    delete[] field;
 
    for (int i = 0; i < row; i++)
    {
        delete[] map[i];
    }
    delete[] map;
 
    return 0;
}



알고리즘은 간단하다. 각 셀에서 주변의 모든 셀을 검사해 지뢰가 있으면 숫자를 증가 시킨다. 모서리에 위치한 셀은 주변 셀을 검사할 때 배열의 범위를 넘어가지 않도록 주의 한다.


실행 결과.


반응형
Posted by J-sean
:
반응형

거실에 큰 TV가 한 대 있지만 식탁과는 마주보지 않고 거의 90도의 각도를 이루고 있기 때문에 식사 중에는 거의 볼 수 가 없다. 밥을 오래 먹는건 아니지만 혼자 밥만 먹기 심심할 때나 가족들과 먹더라도 TV가 보고 싶을때 볼 수 있었으면 좋겠다.


그래서 구매 했다. 샤오미 미 TV 스틱과 10.1인치 모니터.


샤오미 미 TV 스틱.


안드로이드 TV다. 실제 TV 방송을 볼 수는 없다.


미 TV 스틱 외 리모콘, 어댑터, 케이블이 들어 있다.


필요 없는 설명서. 버린다.



따로 구매한 10.1인치 HD TFT LCD 모니터. 박스가 좀 구겨져서 도착 했다.


전원은 12V를 사용하고 2개의 스피커가 달려 있다. 이것 저것 많이 지원한다고 한다.


박스 안에 같이 들어 있는 구성품. 중국 먼지가 많이 따라 왔다. 닦아 주자.


HDMI 외 D-sub, USB등 여러가지 포트가 있다.



그런데 화살표 부분을 잡아 당기면 벗겨져야 할 보호 필름이 벗겨 지지 않는다. 살펴보니 필름이 모니터 케이스에 꽉 물려 있다. 짜증...


분해하기 싫었지만 어쩔 수 없었다. 내부는 평범하다. 흔히 볼 수 있는 AD 보드와 스피커가 보인다.


어쨌든 보호 필름을 제거 했다.


12V 어댑터는 US 타입이므로 KR 타입 플러그를 사용 한다.



모니터 전원을 켜 봤다. 별 이상은 없어 보인다.


샤오미 미 TV 스틱을 연결하고 간단한 세팅 진행 후 유튜브를 실행 한다.


화면 전체적으로 푸른 빛이 돌긴 하지만.. 뭐.. 잘 나온다.


거실 식탁에 올려 놓고 밥먹을 때 봐야겠다.


반응형
Posted by J-sean
:
반응형

nRF24L01 모듈은 Serial Peripheral Interface(SPI) 프로토콜을 사용하여 2.4GHz 무선 통신이 가능하다.


중국에서 구매한 nRF24L01 모듈 2개.


8개의 핀이 있다.


nRF24L01의 핀맵.


아두이노의 핀맵. nRF24L01과 연결할 핀을 확인 한다.



이렇게 연결 한다.


[nRF24L01 - Arduino]

VCC - 3.3V

GND - GND

CSN - 8

CE - 7

MOSI - 11

SCK - 13

IRQ - N/A

MISO - 12


통신을 해야 하므로 2개 모두 연결해 준다.


수신 프로그램을 컴파일 하고 아두이노에 업로드 한다.


송신 프로그램을 컴파일 하고 다른 아두이노에 업로드 한다.



수신 프로그램이 업로드된 아두이노의 시리얼 모니터를 확인해 보자.

통신이 잘 안된다면 10μF 커패시터를 연결 하고 3.3V 외부 전원을 사용 하자.


GND is the Ground Pin. It is usually marked by encasing the pin in a square so it can be used as a reference for identifying the other pins.


VCC supplies power for the module. This can be anywhere from 1.9 to 3.9 volts. You can connect it to 3.3V output from your Arduino. Remember connecting it to 5V pin will likely destroy your nRF24L01+ module!


CE (Chip Enable) is an active-HIGH pin. When selected the nRF24L01 will either transmit or receive, depending upon which mode it is currently in.


CSN (Chip Select Not) is an active-LOW pin and is normally kept HIGH. When this pin goes low, the nRF24L01 begins listening on its SPI port for data and processes it accordingly.


SCK (Serial Clock) accepts clock pulses provided by the SPI bus Master.


MOSI (Master Out Slave In) is SPI input to the nRF24L01.


MISO (Master In Slave Out) is SPI output from the nRF24L01.


IRQ is an interrupt pin that can alert the master when new data is available to process.


반응형
Posted by J-sean
:
반응형

I2C 프로토콜과 SSD1306 드라이버를 사용하는 0.96인치 OLED를 아두이노나 NodeMCU에서 간단하게 사용 할 수 있다.


중국에서 구매한 0.96인치 I2C OLED. SSD1306 드라이버를 사용하고 파란색 화면이 나온다.

(케이스에는 SSD1315라고 표기 되어 있다)


디스플레이 보호 스티커가 붙어 있다.


떼자.


뒷면



아래와 같이 연결한다.

[OLED - 아두이노]

VCC - 5V

GND - GND

SCL - A5

SDA - A4


실제 OLED와는 약간 다르다.


Library Manager에서 adafruit gfx를 검색하고 설치 한다.


Dependencies도 모두 설치 한다.



adafruit ssd1306도 검색해서 설치 한다.


ssd1306_128X64_i2c 예제를 로드한다.


OLED의 주소를 0x3C로 바꾼다.


컴파일하고 아두이노에 업로드 하면 여러가지 예제 화면이 출력 된다.



0.91인치 OLED.


핀맵은 0.96인치 OLED와 동일 하다.


0.96인치 해상도: 128 X 64

0.91인치 해상도: 128 X 32


0.91인치 OLED는 SCREEN_HEIGHT를 32로 바꿔서 테스트 한다.


Adafruit 라이브러리는 용량이 굉장히 크다. 필요 하다면 좀 더 작고 가벼운 U8g2 라이브러리를 사용하자.


그림 출력을 위한 1비트 픽셀 BMP(Black and White) 변환이 필요 하다면 이 링크나 아래 프로그램을 사용하자.

ezBMP.exe



반응형
Posted by J-sean
:
반응형

분당의 많은 아파트가 90년대 초에 지어졌다. 이제 그 아파트들은 내부 자재/기기가 노후되어 제기능을 못 하는 경우가 많은데, 덕분에 한 아파트 내에서도 두어달에 한 집씩은 내부 인테리어를 진행 한다는 안내문이 붙고 며칠 후 큰 소음을 내며 공사가 진행되곤 한다.


물론 우리집도 예외는 아니다. 벽지는 변색되어 몇 년 전에 전체 도배를 새로 했으며 화장실에서 물을 쓰면 어디선가 삐~ 하는 소리가 들려오곤 한다. 겨울철 내 방의 보일러는 무조건 24시간 가동되는 등 크고 작은 문제점들이 많이 발생하고 있다. 한 집에서 오랫동안 살아 오며 하나 둘 발생하는 고장이라 그런 걸까? 그런 현상들이 너무나도 자연스럽게 생활의 일부가 되어 버리고 문제라 생각치 못하게 되는 문제가 문제이다(?)


어쨌든 어릴적 처음 이 아파트로 이사 왔을 때 참 신기했던 장치가 하나 있다. 문 밖에서 서 있는 사람을 화면으로 볼 수 도 있고 아파트 경비실로 전화도 걸 수 있으며 화재, 가스등의 경보도 해 주던, 흔히 인터폰이라고 불리는 인터컴(도어폰)이 신기했을 뿐 아니라 새 집에 이사온 느낌을 한층 배가시켜 주었었다. 벨을 누른 사람도 없는데 괜히 화면을 켜서 작은 모니터를 통해 문 밖 세상을 바라보게 만들기도 했으니 말이다.


꺼져있는 거실의 인터컴. 이젠 얘도 나이가 많다.


그런 인터컴이 이젠 더 이상 작동 하지 않는다. 언제부터 전원이 꺼져 있었는지는 기억도 나지 않고, 몇 달 전 오븐에 피자를 굽다 작은 불을 냈을땐 화려한 조명 마냥 검은 연기가 온 집안을 따뜻하게 감쌌지만 어떤 장치에서도 경보를 해 주지 않는걸 확인 하며 이 집에서 믿을 건 우리 가족 밖에 없다는 걸 다시 한 번 확인 했다.


그러다 더 이상 쓰지도 않고 새로 바꾸고 싶지도 않은 인터컴이 지저분해 보였다. 그냥 깔끔하게 떼버리려 했으나 드러나게 될 인터컴의 뒷 공간때문에 잠시 망설이다 뭔가 비슷하게 꾸며야겠다는 생각이 들었다.


우선 다이소로 달려 갔다.


다이소에서 3,000원 주고 구입해 온 코르크 보드.


10.1인치 LCD 디스플레이를 대본다.


양 옆에 작은 스피커를 달면 귀여울거 같다. 사진에 보이는건 스피커 커버.



이게 스피커(뒷 부분). (3W X 2EA)


대충 잘라 내야 할 부분을 따라 그렸다.


자르고 보니 안쪽은 싸구려 스티로폼이다. 부서진 스티로폼 조각이 막 날린다. 난 분명히 코르크 보드를 샀는데...


모니터와 스피커 커버를 대본다. 모니터는 보드 뒤에 대려고 했는데 아무래도 앞으로 보내야 할 거 같다.



전체적으로 모양이 나쁘지 않다.


글루건으로 고정 한다.


고정 했다.


모니터 AD 보드(Analog to Digital Board)와 (리모콘)컨트롤 보드도 붙여 준다. 오른쪽 케이블이 전원 케이블이다.



글루건이 이것 저것 잘 붙여 준다.


모니터가 잘 나오는지 확인 한다.


설치에 문제가 없는지 확인하기 위해 인터컴을 제거한 벽에 대본다.

문제 없을리가 없다. 스피커 때문에 벽에 안들어 간다. 먼저 확인 했어야 했는데... 그래... 한 번에 될리가 없지...


모니터 아래로 위치를 바꾼다. 스피커를 뗀 자리에 큰 구멍이 두 개 남았다. 후......



전원 공급을 위해 AC to DC 컨버터를 두 개 준비 한다. (220ACV → 5DCV 2A)

한 개는 라즈베리 파이용, 다른 한 개는 모니터와 앰프용이다.

라즈베리 파이는 전원 버튼이 없기 때문에 종료 후 전원 차단을 위한 스위치와 모니터 전원 공급용 터미널도 준비 했다. (모니터 구매 시 받은 터미널은 USB 타입이다)


케이블을 연결하고 글루건으로 고정 한다.


앞면을 보니 그럴 듯 하다. 옆에 튀어 나온건 모니터 (리모콘)컨트롤 보드


라즈베리 파이에 사용할 운영체제를 준비 한다. 집 안의 다른 컴퓨터와 연결 될 수 있도록 네트워크, Samba, VNC등도 세팅 한다.


2020/01/16 - [Raspberry Pi & Arduino] - Raspberry Pi Raspbian 설치 후 업데이트, 한글, 고정 IP, VNC, Samba 설정



지저분한 케이블을 정리 하자.


사용하지 않는 신호 케이블은 모두 정리하고 전원 공급용 220ACV 케이블만 따로 빼서 AC to DC Converter에 연결 한다.


라즈베리 파이를 연결 하고 벽에 붙여 전원을 넣었다. 폭발 하지 않았다. 다행이다.

이것 저것 실행해 본다.


무선 인터넷으로 연결 되어 유튜브도 잘 나온다.



모니터 양 옆의 포스트잇은 신경 쓰지 말자. 무언가를 가리기 위한 것은 아니다.


손님이 놀러 오면 사진을 띄우고 음악을 틀어 준다. (feat. 조카들)


키보드와 마우스를 연결 할 수 도 있지만 거실 벽에 설치 되어 있는 라즈베리 파이에 사용하기는 불편하므로 안쓰는 스마트폰을 무선으로 연결해 컨트롤 한다.


반응형
Posted by J-sean
: