'분류 전체보기'에 해당되는 글 335건

  1. 2019.09.24 Software | AWS Certified 자격증 취득기 - 2 8
  2. 2019.09.08 Hardware | Dual-axis XY Joystick Module
  3. 2019.09.04 Software | AWS Certified 자격증 취득기 - 1 12
  4. 2019.08.30 Software | Daum AdFit 등록해 보기
  5. 2019.08.28 Hardware | LED 전등 교환기
  6. 2019.08.26 Hardware | 555 chip 알아보기 - 1
  7. 2019.08.14 Hardware | ESP-01 or ESP8266 사용기 - 5 2
  8. 2019.08.13 Hardware | ZP07-MP901 공기질 측정 센서
  9. 2019.08.12 Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자 6
  10. 2019.08.10 Hardware | Digital Compass - HMC5883L 사용기 - 3

Software | AWS Certified 자격증 취득기 - 2

|

이 포스트는 AWS 인증 자격시험 두 번째인,

AWS Certified Solutions Architect - Associate 취득기가 되겠습니다.


* Exam Name - AWS Certified Solutions Architect - Associate

* Exam Code - SAA-C01

* Online Class - Exam Readiness: AWS Certified Solutions Architect - Associate


이 시험준비에 앞서 AWS 기초격인 "Cloud Practitioner" 도전기는 아래 포스트를 참고해 주세요.


* Software | AWS Certified 자격증 취득기 - 1

https://chocoball.tistory.com/entry/Software-AWS-Certified-1


이 온라인 강의에 접근하는 방법은, 위의 1편에서 다루어졌으니, 모르시는 분은 1편을 참고해 주세요.





0. 시작하기


이 시험이 묻고자 하는 내용과 범위 입니다.



Cloud Practitioner 와 취급하는 서비스 자체는 같은 것이나,

추구하고자 하는 목적에 부합하는 기능이나 case 들을 이용하여 어떻게 서비스 구성하는 것이 적절한지를 물어보는 형식입니다.


아래에서는 온라인 강의와 예시로 풀어진 문제들 위주로 정리했습니다.

시험보기 전, 이 포스트를 보고 다시금 요약 내용을 확인하는 용도로 생각하면 될 것 같습니다.





1. Design Resilient Architectures


* EC2 Instance Store

- Ephemeral volumes

- Only certain EC2 instances

- Fixed capacity

- Disk type and capacity depends on EC2 instance type

- Application-level durability


* Elastic Block Store

- Different types

- Encryption

- Snapshots

- Provisioned capacity

- Independent lifecycle than EC2 instance

- Multiple volumes striped to create large volumes



* Amazon EFS

- File storage in the AWS Cloud

- Shared storage

- Petabyte-scale file system

- Elastic capacity

- Supports NFS v4.0 and 4.1 (NFSv4) protocol

- Compatible with Linux-based AMIs for Amazon EC2



* Amazon S3

- Consistency model

- Storage classes & Durability - Standard, Standard-IA

- Encryption (data at rest) - SSE-S3, SSE-KMS, SSE-C

- Encryption (data in transit) - HTTPS

- Versioning

- Access control

- Multi-part upload

- Internet-API accessible

- Virtually unlimited capacity

- Regional Availability

- Highly Durable - 99.999999999%


* Amazon Glacier

- Data backup and archive storage

- Vaults and archives

- Retrievals - expedited, standard, bulk

- Encryption

- Amazon S3 object lifecycle policy

- Regionally availability

- Highly durable - 99.999999999%




* Fault Tolerance

The more loosely your system is coupled, the more easily it scales and the more fault-tolerant it can be


* CloudFormation

- Declarative programming language for deploying AWS resources.

- Uses templates and stacks to provision resources.

- Create, update, and delete a set of resources as a single unit (stack).


* AWS Lambda

- Fully managed compute service that runs stateless code (Node.js, Java, C#, Go and Python) in response to an event or on a time-based interval.

- Allows you to run without managing infrastructure like Amazon EC2 instances and Auto Scaling groups.


* Test Axioms

- Expect "Single AZ" will never be a right answer

- Using AWS managed services should always be preferred

- Fault tolerant and high availability are not the same thing

- Expect that everything will fail at some point and design accordingly












2. Design Performance Architectures


* Amazon EBS Volume Types


* Amazon S3 Buckets

- To upload your data (photos, videos, documents)

1. Create a bucket in one of the AWS Regions.

2. Upload any number of objects to the bucket.

- Bucket (Virtural hosted-based URLs)

http://bucket.s3.amazonaws.com

http://bucket.s3-aws-region.amazonaws.com

- Object

https://s3-ap-northeast-1.amazonaws.com/[bucket name]/Key (file name)


* Amazon S3: Payment Model

- Pay only for what you use

-- GBs per month

-- Transfer out of region

-- PUT, COPY, POST, LIST, and GET requests

- Free of charge

-- Transfer in to Amazon S3

-- Transfer out from Amazon S3 to Amazon CloudFront or the same region


* Amazon S3: Storage Classes

- General purpose: Amazon S3 Standard

-- Higher availability requirements: Use cross-region replication.

- Infrequently accessed data: Amazon S3 Standard - Infrequent Access

-- Lower cost per GB stored

-- Higher cost per PUT, COPY, POST, or GET request

-- 30-day storage minimum


* Lifecycle Policies

- Amazon S3 lifecycle policies allow you to delete or move objects based on age.

-- until 30 Days : Amazon S3 Standard

-- until 60 Days : Amazon S3 Standard - Infrequent Access

-- until 365 Days : Amazon Glacier

-- after 365 Days : Delete


* Amazon Databases

- Amazon Relational Database Service

- Amazon DynamoDB

- Amazon Redshift


* When to Use Amazon RDS

- Use Amazon RDS

-- Complex transactions or complex queries

-- A medium-to-high query/write rate

-- No more than a single worker node/shard

-- High durability

- Do not use Amazon RDS

-- Massive read/write rates (e.g., 150 K write/second)

-- Sharding

-- Simple GET/PUT requests and queries

-- RDBMS customization


* RDS Read Replicas


* DynamoDB: Provisioned Throughput

- Allocates resources based on throughput capacity requirements (read/write)

-- Read capacity unit (for an item up to 4 KB in size)

One strongly consistent read per second

Two eventually consistent reads per second

-- Write capacity unit (for an item up to 1 KB in size)

One write per second


* Caching in CloudFront

1. Request is routed to most optimal edge location.

2. Non-cached content is retrieved from the origin.

3. Origin content is transferred to CloudFront edge location for caching.

4. Data is transferred to end user.


* Caching with ElastiCache



* Memcached vs. Redis

- Memcached

-- Multithreading

-- Low maintenance

-- Easy horizontal scalability with Auto Discovery

- Redis

-- Support for data structures

-- Persistence

-- Atomic operations

-- Pub/sub messaging

-- Read replicas/failover

-- Cluster mode/sharded clusters


* Amazon CloudFront

- Use case and benefits

- Content - static and dynamic

- Origins - S3, EC2, ELB, HTTP server

- Protect private content

- Improve security

-- AWS Shield Standard and Advanced

-- AWS WAF


* Vertical Scaling vs. Horizontal Scaling

- Vertical scaling (Scale up and down)

-- Change in the specifications of instances (more CPU, memory)

- Horizontal scaling ( Scale in and out)

-- Change in the number of instances (add and remove instances as needed)


* Auto Scaling

- Launches or terminates instances

- Automatically registers new instances with load balancers

- Can launch across Availability Zones


* Implement Elasticity



* Auto Scaling

- Launches or terminates instances

- Automatically registers new instances with load balancers

- Can launch across Availa


* Auto Scaling Components

- Auto Scaling launch configuration

-- Specifies EC2 instance size and AMI name

- Auto Scaling group

-- References the launch configuration

-- Specifies min, max, and desired size of the Auto Scaling group

-- May reference an ELB

-- Health Check Type

- Auto Scaling policy

-- Specifies how much to scale in or scale out

-- One or more may be attached to Auto Scaling group


* CloudWatch Metrics

- Know what CloudWatch can monitor

-- CPU / Network / Queue Size

- Understand CloudWatch Logs

- Understand the difference between default and custom metrics


* Test Axioms

- If data is unstructured, Amazon S3 is generally the storage solution.

- Use caching strategically to improve performance.

- Know when and why to use Auto Scaling.

- Choose the instance and database type that makes the most sense for your workload and performance need.

















3. Specify Secure Applications and Architectures


* Infrastructure

- Infrastructure

-- Shared responsibility model

- Protecting your AWS resources

-- Principle of least privilege

-- Identities


* Shared Responsibility Model



* Principle of Least Privilege

- Persons (or processes) can perform all activities they need to perform, and no more.


* AWS IAM

- Centrally manage users and user permissions in AWS.

- Using AWS IAM, you can:

-- Create users, groups, roles and policies.

-- Define permissions to control which AWS resources users can access

- IAM integrates with Microsoft Active Directory and AWS Directory Service using SAML identity federation.


* Identities

- IAM users: Users created within the account.

- Roles: Temporary identities used by EC2 instances, Lambdas, and external users.

- Federation: Users with Active Directory identities or other corporate credentials have role assigned in IAM.

- Web Identity Federation: Users with web identities from Amazon.com or other Open ID provider have role assigned using Security Token Service (STS).


* Compute/Network Architecture

- Virtual Private Cloud (VPC)

- Design your network architecture in the cloud

-- Security

-- Routing

-- Network isolation

-- Management

-- Bastion hosts


* Virtual Private Cloud

- Organization: Subnets

- Security: Security groups/access control lists

- Network isolation: Internet gateways/virtual private gateways/NAT gateways

- Traffic direction: Routes


* How to Use Subnets

- Recommendation: Use subnets to define internet accessibility.

- Public subnets

-- To support inbound/outbound access to the public internet, include a routing table entry to an internet gateway

- Private subnets

-- Do not have a routing table entry to an internet gateway

-- Not directly accessible from the public internet

-- To support restricted, outbound-only public internet access, typically use a "jump box" (NAT/proxy/bastion host)


* Security groups vs. Network ACL



* Security Groups



* VPC Connections

- Know the services to get traffic in or out of your VPC

-- Internet gateway: Connect to the internet

-- Virtual private gateway: Connect to the internet

-- AWS Direct Connect: Dedicated pipe

-- VPC peering: Connect to other VPCs

-- NAT gateways: Allow internet traffic from private subnets


* Outbound Traffic From Pirvate Instances



* Data Tier

- Data in transit

-- In and out of AWS

-- Within AWS

- Data at rest

-- Amazon S3

-- Amazon EBS


* Data in Transit

- Transferring data in and out of your AWS infrastructure

-- SSL over web

-- VPN for IPsec

-- IPsec over AWS Direct Connect

-- Import/Export/Snowball

- Data sent to the AWS API

-- AWS API calls use HTTPS/SSL by default


* Data at Rest

- Data stored in Amazon S3 is private by default, requires AWS credentials for access

-- Access over HTTP or HTTPS

-- Audit of access to all objects

-- Supports ACL and policies

--- Buckets

--- Prefixes (directory/folder)

--- Objects

- Server-side encryption options

-- Amazon S3-Managed Keys (SSE-S3)

-- KMS-Managed Keys (SSE-KMS)

-- Customer-Provided Keys (SSE-C)

- Client-side encryption options

-- KMS managed master encryption keys (CSE-KMS)

-- Customer managed master encryption keys (CSE-C)


* Managing Your Keys

- Key Management Service

-- Customer software-based key management

-- Integrated with many AWS services

-- Use directly from application

- AWS CloudHSM

-- Hardware-based key management

-- Use directly from application

-- FIPS 140-2 compliance


* Integrating AWS KMS

- Amazon EBS/S3/RDS/Redshift/Elastic Transcoder/WorkMail/EMR


* Test Axioms

- Lock down the root user

- Security groups only allow. Network ACLs allow explicit deny

- Prefer IAM Roles to access keys









4. Design Cost-optimized Architectures


* Amazon EC2 Pricing

- Clock hours of server time

- Machine configuration

- Machine purchase type

- Number of instatnces

- Load balancing

- Detailed monitoring

- Auto Scaling

- Elastic IP adresses

- Operating systems and software packages


* Amazon EC2: Ways to Save Money

- Reserved Instances

-- EC2 Reserved Instances (RI) provide a significant discount (up to 75%) compared to on-demand pricing.

-- RI Types: Standard IRs / Convertible RIs / Scheduled RIs

- Spot Instances

-- Spot Instances are spare compute capacity in the AWS Cloud available to you at steep discounts compared to on-demand prices (30 t0 45%)


* Amazon S3 Pricing

- Storage class

- Storage

- Requests

- Data transfer


* Amazon S3 Storage Classes



* Amazon EBS Pricing

- Considerations for estimating the cost of using Amazon EBS

-- Volumes

-- Input/output operations per second (IOPS)

-- Snapshots

-- Data transfer


* Serverless Architecture

- Recognize the opportunity to reduce compute spend through serverless architectures

-- AWS Lambda / S3 / DynamoDB / API Gateway


* Storage: Amazon CloudFront

- Use cases

-- Content - Static and dynamic

-- Origins - Amazon S3, EC2, Elastic Load Balancing, HTTP servers

- Cost Benefits

-- No cost for data transfer between S3 and CloudFront

-- Can be used to reduce the compute workload for EC2 instances


* Caching with CloudFront

Considerations for estimating the cost of using Amazon CloudFront:

- Traffic distribution
- Requests
- Data transfer out
Caching with CloudFront can have positive impacts on both performance and cost-optimization!

* Test Axioms

- If you know it's going to be on, reserve it.

- Any unused CPU time is a waste of money.

- Use the most cost-effective data storage service and class.

- Determine the most cost-effective EC2 pricing model and instance type for each workload.







5. Define Operationally-excellent Architectures


* Operational Excellence

The ability to run and monitor systems to deliver business value and continually improve supporting processes and procedures.

- Prepare / Operate / Evolve


* Operational Excellence: Design Principles

- Perform operations with code

- Annotate documentation

- Make frequent, small, reversible changes

- Refine operations procedures frequently

- Anticipate failure

- Learn from all operational failures


* AWS Services Supporting Operational Excellence

- AWS Config

- AWS CloudFormation

- AWS Trusted Advisor

- AWS Inspector

- VPC Flow Logs

- AWS Cloud Trail


* CloudWatch



* Test Axioms

- IAM roles and easier and safer than keys and passwords

- Monitor metrics across the system

- Automate responses to metrics where appropriate

- Provide alerts for anomalous conditions








6. 자료


시험볼 때 참고한 덤프와 온라인 강의 정리 공유합니다.


* PDF dump

AWS-Solutions-Associate_V17.35.pdf

AWS-Solutions-Associate-KR_V17.35.pdf

AWS-Solutions-Architect-Associate_V16.75.pdf

AWS_Solutions_Architect_Associate_2016_pdf.zip


* ETE dump of 2018 / 2019

AWS_Solutions_Architect_Associate_2019_ete.zip.001

AWS_Solutions_Architect_Associate_2019_ete.zip.002


* On-line summary

AWS_SAA-C01_20190903_chocoball.pdf


* On-line practice (SAA-P01)

AWS_SAA-P01_20190922_chocoball.pdf


* Website dump

https://www.freecram.com/exam/AWS-Solutions-Associate-aws-certified-solutions-architect-associate-e7428.html


- https://www.freecram.com/question/Amazon.AWS-Solutions-Associate.v2019-07-29.q257/you-are-designing-a-data-leak-prevention-solution-for-your-vpc-environment-you-want-your-vpc-instances


- https://www.freecram.com/question/Amazon.AWS-Solutions-Associate.v2018-01-08.q430/which-technique-can-be-used-to-integrate-aws-iam-identity-and-access-management-with-an-on-premise


https://www.freecram.com/question/BluePrism.Architect-Associate.v2018-11-27.q75/a-company-requires-that-the-source-destination-and-protocol-of-all-ip-packets-be-recorded-when-traversin





7. 등록


언제 시험볼까 고민만 하다가는 시간만 갈 것 같아, 첫시험 본 다음날 바로 다음 시험을 등록했습니다.



미리 가서 공부할 수 있는 환경이 조성된 KG ITBANK 로 결정. 시간은 아침 제일 빠른게 좋죠.



Cloud Practitioner 합격 후, 받은 50% discount 쿠폰을 사용해 봅니다.



오오오! 17만원이던게 반으로 깎이는 마술이!



이제 되돌아 가지 못합니다. 앞으로 나아가는 수 밖에.



주사위는 던져졌습니다.

보유하고 있는 덤프 및 공부 자료를 본 결과, 하루에 100문제 정도 풀 수 있는 시간을 확보해야 하네요.

만만치 않습니다만, 직접 AWS Management Console 에서 테스트 하면서 공부하니, 이제 좀 시스템이 실감이 나고 재미 있습니다.





8. SAA-P01


Architect - Associate 의 시험 코드는 SAA-C01 입니다.

네 맞아요, SAA-P01 은 Practice 시험 입니다. 인가된 시험장이 아닌 인터넷이 되는 어느곳에서든 시험삼아 보는 시험이지요.

본 시험은 비싸니, 감 잡으라고 만든 30분짜리 시험 입니다. 특별히 예약하지 않고, 등록 후 바로 시험볼 수 있습니다.


가격은 세금 포함 2만 5천원 정도 하는데,

Practitioner 를 따면, 이 Practice 시험을 공짜로 한번 볼 수 있는 바우처를 줍니다.



시험을 하나 pass 할 때 마다, Practice Voucher 와 50% discount 는 매번 나오니 아껴쓰지 않습니다.



Practice 시험을 선택하고 "Pay For Exam" 하면, 보통 시험 지불하는 화면이 아래처럼 나옵니다.



Payment 란에, 받은 Voucher 번호를 넣고 적용하면, 공짜가 되는 마술을 볼 수 있습니다.



저는 시험보기 이틀 전에 봤습니다.

지금까지 한 공부가 맞는 방법인지 확인하고, 틀렸으면 새로운 공부 전략을 짜기 위해서죠.

떨리는 마음으로 Start 를 눌러서 30분간 지옥을 맛봅니다. 아무리 연습이라도 모니터에 본 시험과 같이 나오니 긴장 엄청 됩니다.



제길슨... 52%. 이대로는 떨어진다는 소리 입니다.


이 Practice 시험 이후, 보고 있던 예전 dump 는 바로 버리고, 남은 하루 반을 오로지 최신 덤프 + 인터넷 최신 시험 예상 문제 사이트를 중심으로 빡쎄게 공부하게 됩니다.


예전 dump 를 바로 버린 이유는, 이 연습 시험을 통해, 예전 덤프에서의 간단한 시나리오 설명과 문제는 지금 출제 성향과 너무 다르다는걸 알았기 때문입니다. 정말 도움이 많이 되었습니다.





9. 시험 당일


새벽 5시에 일어나서 한시간 공부한 다음, 언제나처럼 목욕 재개 후, 길을 떠납니다.



버스타고 가면서 낮게 깔린 안개와 해뜨는 장면이 멋있어서 찍어 봤습니다.



이번이 세번째 방문인 KG ITBANK.

8시에 도착했으니, 한시간 가량 더 공부하고 시험 쳤습니다.


130분 동안, 65문제.

34초 남겨두고 End Test 버튼을 누를 만큼 저에게는 어려웠습니다.

시나리오에 맞는 답을 고르는려면 문제 본문을 읽어야 하는데, 이게 생각 외로 많이 걸립니다.


추가로, 어떤 놈이 주차장 출구 센서쪽에 주차를 한 바람에 새벽 내내 울려 퍼지는 알람소리로 잠을 설쳤더니만, 헤롱헤롱 했습니다.

머리와 몸을 쥐어 짜며 130분 꽉꽉 채웠습니다.



휴우~... 하얕게 불태웠어. 시험 끝나고 밖에 나오니 가을 햇빛에 눈이 부십니다.



그래도 여기까지 왔으니, 종로 보석상가 전경도 찍어 봅니다.



바로 옆에 공원으로 잘 조성이 되어 있더군요. 왠지 바로 회사 가기는 아쉬워서 잠시 들러보기로 합니다.



조선시대 왕의 행사 때, 행진에 사용된 종묘전교도 건너가 보구요.



공원 한쪽에 있는 "월남 이상재 선생" 동상도 봤습니다.

독립운동가시고, 1927년 독립운동중에 서거하셨다고 합니다.

전혀 모르던 우리의 자랑스런 독립 운동가셨군요. 꼭 기억하겠습니다.



동상 뒤쪽에 쓰인 글귀가 좋아서 찍어 봤습니다.



오늘 우리를 있게 해준, 너무나도 감사한 우리 조상님들 입니다.

감사합니다. 잊지 않겠습니다. 열씸히 살겠습니다.



공원을 지나 버스타러 가던 길에 있는 큰 학원 건물 입니다. 희한하게 이런 모양의 건물이 몇 개 더 있습니다.

경사면을 없애고, 그냥 똑바로 위에까지 올렸으면 공간이 더 많이 나왔을 터인데... 왜 이렇게 디자인 했을까요?



노인들 분만 서명하고 있었습니다. 이런 천막이 두 개 더 있더군요. 오로지 노인 분들만...



시간이 점심시간이 거의 다 되어 버려서, 버전에 갔던 버거킹에는 자리가 없을 것 같았습니다.

정류장 근처까지 오니 못보던 버거가게가 있네요.



세트메뉴로 하니 9,800원이 나왔습니다. 오늘만큼은 수고한 나에게 선물이라고 생각하고 맛있게, 그리고 여유 있게 먹었습니다.



음? 건너편에 SUBWAY 가! 다음 시험때는 저기에서 먹어야겠습니다.



한화 빌딩 앞에서 버스를 타는데, 태양전지 발전 정류소라 합니다. 제가 좋아하는 태양 전지라니!



그러고 보니 정류소 지붕 위에 태양 전지판이 설치되어 있었습니다. ECO 는 좋은 것입니다.



강남으로 가는 한남대교에서... 가을 하늘이 더할 나위 없이 좋습니다.





10. 결과


운이 좋았는지 다행히 PASS 하였습니다!!!



점수는 720 커트라인에 755점. 역시 이 맛에 시험 칩니다. (라고 하기엔 매번...)



분야별로 본다면, 전반적으로 고루 나왔네요.



Benefit 도 새로이 갱신 되었습니다. 정말 매번 패스할 때 마다 공짜 Practice 와 50% discount 가 나오는군요.






FIN


시험은 dump 로 하는게 아닌 것이라고 이번에 배우게 되었습니다.

Dump 처럼 나왔더라도 dump 와 동일하게 나온 것은 5문제 될까 말까...


Solution Architect 시험인지라, 상황을 제시하고 해결 위한 답을 찾아야 합니다.

답들도 서로 비슷비슷하게 해 놔서, 해당 지식을 확실히 알고 있지 못하면, 문제를 풀 수 없습니다.


온라인 강의에서 했던 말이 계속 귀에 맴돕니다.


"get hands dirty"


쉽게 공부하지 말고, 직접 손으로 해보면서 불편하게 공부하라는 이야기 입니다.

이 문구가 이 시험의 근본을 설명한다고 생각합니다.


쥐어 짜면서 공부했지만, 결과가 좋아서 기분이 너무 좋습니다.

이제 Architect - Professional 을 위해 다시 시작합니다.


And

Hardware | Dual-axis XY Joystick Module

|

1. Dual-Axis XY


집에 가지고 있는 Stepping motor 를 원격으로 조정하고 싶을 때, 조이스틱으로 하면 편할것 같아,

우선 arduino 와 조이스틱 구성의 기본 동작을 익혀봤습니다.


위의 목적 외에도 새로운 모듈을 시험해 보는 것은 언제나 즐거운 일 입니다.




2. 구매


AliExpress 를 뒤지면 여러가지 나오는데, 저는 아래 제품을 구매 했습니다.


* For Arduino Dual-axis XY Joystick Module Higher Quality PS2 Joystick Control Lever Sensor KY-023 Rated 4.9 /5

https://www.aliexpress.com/item/32683242155.html



옵션으로 고정 틀이 들어간 세트도 같이 팔지만,

언제나 그렇 듯, 최소한의 비용 투자가 회사원의 취미로 유지되는 조건이므로 모듈만 구매합니다.


혹시 여유가 있으시다면, 아크릴 고정 틀 세트로 구매하시는 것을 추천드립니다.

어디 놓고 테스트 하거나 구동시킬라면 손으로 잡고 해야 하는데 꽤 불편합니다.





3. 도착


잊을만 할 때 도착했습니다.



엄지 손가락으로 조정하는 고무 모자를 벗겨 보면, XY 축 센서와 SW 센서가 붙어 있습니다.



더 이상 설명이 필요없는 간단한 구성 입니다.





4. Layout


XY 센서는 analog 이고, switch 는 digital 신호로 컨트롤 됩니다.

Arduino nano 와의 연결은 다음과 같습니다.


  Joystick | Arduino Nano
--------------------------
    GND    |     GND
    5V     |     5V
    VRX    |     A0
    VRY    |     A1
    SW     |     D2
--------------------------


배선도는 다음과 같구요.



실제 연결은 다음과 같습니다.



선이 5가닥이 필요하다 보니, 회로 구성 시 자칫 복잡해 질 수 있는 여건이네요.




5. Sketch


소스는 다음과 같습니다. 소스 참고는 아래 사이트 입니다.


* How to connect and use Analog Joystick with Arduino

https://www.brainy-bits.com/arduino-joystick-tutorial/


Switch 눌림과 XY 축 값을 5V 기준으로 leveling 하여 수치로 표시해 줍니다.


// Arduino pin numbers
const int SW_pin = 2; // digital pin connected to switch output
const int X_pin = 0; // analog pin connected to X output
const int Y_pin = 1; // analog pin connected to Y output

void setup() {
	pinMode(SW_pin, INPUT);
	digitalWrite(SW_pin, HIGH);
	Serial.begin(115200);
}

void loop() {
	Serial.print("Switch:  ");
	Serial.println(digitalRead(SW_pin));
	Serial.print("X-axis: ");
	Serial.println(analogRead(X_pin));
	Serial.print("Y-axis: ");
	Serial.println(analogRead(Y_pin));
	Serial.print("\n");
	
	delay(500);
}


스위치가 눌려있는 시간에는 Switch 값이 "0" 으로 변합니다.



요리조리 움직이다 보면 최대값이 나오는 구간이 있습니다. 5V 입력이다 보니 최대값이 1023 으로 표시됩니다.



입력 Vcc 를 3.3V 로 변경하면, 5V 대비 3.3V 로 레벨링 하여 나옵니다. 이 때는 대략 675 정도가 최대값이 되겠네요.



동영상 띄워 봅니다.






FIN


음? 벌써 끝?

네, 이 포스트는 gimbal 에 달려 있는 stepping 모터를 컨트롤 하기 위한 준비 단계라,

XY joystick 모듈과 arduino 와의 연결 확인만 되면 됩니다.


실제 gimbal 과 연결하여 stepping 모터를 컨트롤 하는 것은 다음 포트스에서 해보겠습니다.


And

Software | AWS Certified 자격증 취득기 - 1

|

1. 이번엔 AWS 다~!


저번 Microsoft 공인 인증 시험 시리즈에 이어, 이번달 부터는 Amazon Web Service (AWS) 공인 인증서 취득 도전을 시작했습니다.

최근 IT vendor 중에서 1위 업체이기도 하고, 취업시 도움이 많이 되어 인기 있는 인증서니까요.


AWS 인증서 체계는 아래 스샷에 잘 설명되어 있습니다.



AWS 에 대한 기초적인 개념은 "Cloud Practitioner" 이고, 이걸 바탕으로 각 IT 부문별 4가지로 분류됩니다.


- Architect

- Developer

- Operations

- Specialty (Advanced Networking / Big Data / Security)


Specialty 를 제외하고, 각 분야별로 레벨이 Associate (기본) 과 Professional (전문가) 로 또 나뉘어 있습니다.

저는 아래 순서대로 자격증 취득을 목표로 하고 있습니다.


Cloud Practitioner > Solutions Architect - Associate > Solutions Architect - Professional

> Advanced Networking > Big Data > Security


총 6개 과목에 대해 도전할 예정입니다.

Solutions Architect - Professional 까지만으로도 충분할 것 같지만, 이왕 하는 김에 Specialty 도 도전해 보려구요.

AWS 의 특화 분야 활용이 최종적으로 어떻게 되는지도 너무 궁금하기도 하고.


각 과목당 해당 시험 코드가 있습니다. 시험 공부와 신청 시, 이 코드로 서로 엮여 있으므로 알고 있는게 좋습니다.


AWS Certified Cloud Practitioner                   CLF-C01

AWS Certified Developer - Associate                DVA-C01
AWS Certified Solutions Architect - Associate      SAA-C01
AWS Certified SysOps Administrator - Associate     SOA-C01

AWS Certified DevOps Engineer - Professional       DOP-C01
AWS Certified Solutions Architect - Professional   SAP-C01

AWS Certified Advanced Networking - Specialty      ANS-C00
AWS Certified Alexa Skill Builder - Specialty      AXS-C01
AWS Certified Big Data - Specialty                 BDS-C00
AWS Certified Machine Learning - Specialty         MLS-C01
AWS Certified Security - Specialty                 SCS-C01


정리하면서 알게된 것인데, Machine Learning 도 생겼나 보네요.

욕심은 나지만, 일단 6개 도전입니다.





2. On-line training


AWS 인증서 준비에 필요한 온라인 강의가 Amazon 으로부터 무료로 제공됩니다.

아래 사이트에서 본인 등록 하고, 강의를 찾아 봅니다.


* AWS training and certification

https://www.aws.training/


처음 시험으로 Cloud Practitioner 를 준비할 것이기에, 아래 강좌를 신청합니다.



이 강좌를 시작하면, 아래와 같이 각 세션별로 강의가 분리되어 있습니다.

전부 다 합쳐봐야 몇 시간 안되므로 집중해서 열씸히 수업합니다.



여기서 다시금 인식한 사실.

AWS 서비스는 고객이 Cloud 에 직접 시버스를 구축할 수 있도록 하기위해 이 많은 서비스들이 생겨났다. 입니다.

이런 인증서 시스템을 통해, 꾸려놓은 서비스들을 효과적으로 보급하고, 시험으로 돈도 벌고... 장사꾼이지만 좋은 방법입니다.



Amazon 에 근무하는 사람들도 이 많은 시스템을 알아야 하니,

미리 인증서로 공부시켜 놓고, 인증서를 딴 사람을 채용 대상으로 하는 이유도 여기에 있을 것 같네요.


마침 시험 당일 하루 전 (9월 2일)에 온라인 워크샵이 있어서 webinar 에 참석했습니다.


* 무료 'AWS 자격증 시험 준비 워크샵'

https://pages.awscloud.com/get_certified_kr_2019.html



Cloud Practitioner 와 Architect - Associate 과정이 있습니다.

기본 내용은 AWS on-line 교육과 동일한 내용입니다만, 여기서는 한글로 강의를 해 줍니다.






3. 정리


AWS 의 각 서비스들에 대해 공부하면서 간단히 정리해 봤습니다.

제가 영어 시험을 신청한 터라, 자료 정리를 영어로 했습니다. 한글 정리본은 제일 밑에 따로 올려 놨습니다.


AWS 자격 인증은, 우선 어떤 서비스들이 있고, 어떤 기능을 가지는지를 물어봅니다.

그래서 아래와 같이 각 서비스의 명칭과 그에 대한 간단한 설명을 남겨 봅니다.


Amazon EC2


https://aws.amazon.com/ec2/

A web service that provides secure, resizable compute capacity in the cloud. It is designed to make web-scale cloud computing easier for developers.


* On-Demand

- Users that prefer the low cost and flexibility of Amazon EC2 without any up-front payment or long-term commitment

- Applications with short-term, spiky, or unpredictable workloads that cannot be interrupted

- Applications being developed or tested on Amazon EC2 for the first time

* Reserved Instances (up to 75% save compared to On-Demand)

- Applications with steady state usage

- Applications that may require reserved capacity

- Customers that can commit to using EC2 over a 1 or 3 year term to reduce their total computing costs

* Spot Instances (up to 90% save compared to On-Demand)

- Applications that have flexible start and end times

- Applications that are only feasible at very low compute prices

- Users with urgent computing needs for large amounts of additional capacity

* Dedicated hosts

- Can be purchased On-Demand (hourly).

- Can be purchased as a Reservation for up to 70% off the On-Demand price.

* Per Second Billing

- On-Demand, Reserved and Spot forms

- All regions and Availability Zones

- Amazon Linux and Ubuntu


Amazon Virtual Private Cloud (VPC)



https://aws.amazon.com/vpc/

lets you provision a logically isolated section of the AWS Cloud where you can launch AWS resources in a virtual network that you define.


Amazon EBS (Elastic Block Storage)


https://aws.amazon.com/ebs/

An easy to use, high performance block storage service designed for use with Amazon Elastic Compute Cloud (EC2) for both throughput and transaction intensive workloads at any scale. A broad range of workloads, such as relational and non-relational databases, enterprise applications, containerized applications, big data analytics engines, file systems, and media workflows are widely deployed on Amazon EBS.


Amazon EFS (Elastic File System)


https://aws.amazon.com/efs/

provides a simple, scalable, elastic file system for Linux-based workloads for use with AWS Cloud services and on-premises resources. It is designed to provide massively parallel shared access to thousands of Amazon EC2 instances, enabling your applications to achieve high levels of aggregate throughput and IOPS with consistent low latencies.


Amazon S3 (Simple Storage Service)


https://aws.amazon.com/s3/

An object storage service that offers industry-leading scalability, data availability, security, and performance. This means customers of all sizes and industries can use it to store and protect any amount of data for a range of use cases, such as websites, mobile applications, backup and restore, archive, enterprise applications, IoT devices, and big data analytics.

S3 에 있는 object 는 HTTP 프로토콜 + bucket prefix 를 이용하여 마음대로 꺼내 쓸 수 있다.



Amazon Route 53


https://aws.amazon.com/route53/

A highly available and scalable cloud Domain Name System (DNS) web service. It is designed to give developers and businesses an extremely reliable and cost effective way to route end users to Internet applications by translating names like www.example.com into the numeric IP addresses like 192.0.2.1 that computers use to connect to each other. Amazon Route 53 is fully compliant with IPv6 as well.


Elastic Load-Balancing


https://aws.amazon.com/elasticloadbalancing/

Automatically distributes incoming application traffic across multiple targets, such as Amazon EC2 instances, containers, IP addresses, and Lambda functions.


Amazon CloudFront


https://aws.amazon.com/cloudfront/

A fast content delivery network (CDN) service that securely delivers data, videos, applications, and APIs to customers globally with low latency, high transfer speeds, all within a developer-friendly environment.

- keywords : CDN / edge location


AWS Direct Connect


https://aws.amazon.com/directconnect/

A cloud service solution that makes it easy to establish a dedicated network connection from your premises to AWS. Using AWS Direct Connect, you can establish private connectivity between AWS and your datacenter, office, or colocation environment, which in many cases can reduce your network costs, increase bandwidth throughput, and provide a more consistent network experience than Internet-based connections.


AWS Data Pipeline


https://aws.amazon.com/datapipeline/

A web service that helps you reliably process and move data between different AWS compute and storage services, as well as on-premises data sources, at specified intervals.


Amazon RDS (Relational Database Service)


https://aws.amazon.com/rds/

makes it easy to set up, operate, and scale a relational database in the cloud. It provides cost-efficient and resizable capacity while automating time-consuming administration tasks such as hardware provisioning, database setup, patching and backups.


Amazon DynamoDB (NoSQL)


https://aws.amazon.com/dynamodb/

A key-value and document database that delivers single-digit millisecond performance at any scale. It's a fully managed, multiregion, multimaster, durable database with built-in security, backup and restore, and in-memory caching for internet-scale applications.


Amazon ElastiCache



https://aws.amazon.com/elasticache/

Fully managed Redis and Memcached. Seamlessly deploy, run, and scale popular open source compatible in-memory data stores. Build data-intensive apps or improve the performance of your existing apps by retrieving data from high throughput and low latency in-memory data stores.


Amazon Aurora


https://aws.amazon.com/rds/aurora/

A MySQL and PostgreSQL-compatible relational database built for the cloud, that combines the performance and availability of traditional enterprise databases with the simplicity and cost-effectiveness of open source databases.


AWS Snowball


https://aws.amazon.com/snowball/

A petabyte-scale data transport solution that uses devices designed to be secure to transfer large amounts of data into and out of the AWS Cloud. Using Snowball addresses common challenges with large-scale data transfers including high network costs, long transfer times, and security concerns.


Amazon Redshift


https://aws.amazon.com/redshift/

The world's fastest cloud data warehouse today and gets dramatically faster every year.  Highly concurrent workloads? Not a problem.  Redshift can handle virtually unlimited concurrency.  


AWS Database Migration Service

helps you migrate databases to AWS quickly and securely. The source database remains fully operational during the migration, minimizing downtime to applications that rely on the database. The AWS Database Migration Service can migrate your data to and from most widely used commercial and open-source databases.

AWS Migration Hub
provides a single location to track the progress of application migrations across multiple AWS and partner solutions. Using Migration Hub allows you to choose the AWS and partner migration tools that best fit your needs, while providing visibility into the status of migrations across your portfolio of applications.


Amazon EMR (Elastic MapReduce)


https://aws.amazon.com/emr/

The industry leading cloud-native big data platform, allowing teams to process vast amounts of data quickly, and cost-effectively at scale. Using open source tools such as Apache Spark, Apache Hive, Apache HBase, Apache Flink, and Presto, coupled with the dynamic scalability of Amazon EC2 and scalable storage of Amazon S3, EMR gives analytical teams the engines and elasticity to run Petabyte-scale analysis for a fraction of the cost of traditional on-premise clusters.


AWS Lambda


https://aws.amazon.com/lambda/

With Lambda, you can run code for virtually any type of application or backend service - all with zero administration. Just upload your code and Lambda takes care of everything required to run and scale your code with high availability.


AWS OpsWorks



https://aws.amazon.com/opsworks/

A configuration management service that provides managed instances of Chef and Puppet. Chef and Puppet are automation platforms that allow you to use code to automate the configurations of your servers.


AWS Elastic Beanstalk


https://aws.amazon.com/elasticbeanstalk/

An easy-to-use service for deploying and scaling web applications and services developed with Java, .NET, PHP, Node.js, Python, Ruby, Go, and Docker on familiar servers such as Apache, Nginx, Passenger, and IIS.


Amazon CloudFormation


https://aws.amazon.com/cloudformation/

provides a common language for you to describe and provision all the infrastructure resources in your cloud environment. CloudFormation allows you to use a simple text file to model and provision, in an automated and secure manner, all the resources needed for your applications across all regions and accounts.


Amazon Inspector

https://aws.amazon.com/inspector/

An automated security assessment service that helps improve the security and compliance of applications deployed on AWS. Amazon Inspector automatically assesses applications for exposure, vulnerabilities, and deviations from best practices.


AWS Trusted Advisor


https://aws.amazon.com/premiumsupport/technology/trusted-advisor/

An online tool that provides you real time guidance to help you provision your resources following AWS best practices.

Whether establishing new workflows, developing applications, or as part of ongoing improvement, take advantage of the recommendations provided by Trusted Advisor on a regular basis to help keep your solutions provisioned optimally.


Amazon CloudWatch


https://aws.amazon.com/cloudwatch/

A monitoring and observability service built for DevOps engineers, developers, site reliability engineers (SREs), and IT managers. CloudWatch provides you with data and actionable insights to monitor your applications, respond to system-wide performance changes, optimize resource utilization, and get a unified view of operational health.


AWS CloudTrail


https://aws.amazon.com/cloudtrail/

A service that enables governance, compliance, operational auditing, and risk auditing of your AWS account. With CloudTrail, you can log, continuously monitor, and retain account activity related to actions across your AWS infrastructure.


AWS X-Ray


https://aws.amazon.com/xray/

helps developers analyze and debug production, distributed applications, such as those built using a microservices architecture. With X-Ray, you can understand how your application and its underlying services are performing to identify and troubleshoot the root cause of performance issues and errors.


Amazon WorkSpaces

https://aws.amazon.com/workspaces/

A managed, secure cloud desktop service. You can use Amazon WorkSpaces to provision either Windows or Linux desktops in just a few minutes and quickly scale to provide thousands of desktops to workers across the globe.


AWS Organizations

https://aws.amazon.com/organizations/

helps you centrally govern your environment as you grow and scale your workloads on AWS. Whether you are a growing startup or a large enterprise, Organizations helps you to centrally manage billing; control access, compliance, and security; and share resources across your AWS accounts.


AWS Identity and Access Management (IAM)

https://aws.amazon.com/iam/

enables you to manage access to AWS services and resources securely. Using IAM, you can create and manage AWS users and groups, and use permissions to allow and deny their access to AWS resources. 


Amazon Lightsail

https://aws.amazon.com/lightsail/

An easy-to-use cloud platform that offers you everything needed to build an application or website, plus a cost-effective, monthly plan. Whether you’re new to the cloud or looking to get on the cloud quickly with AWS infrastructure you trust, we’ve got you covered.


About AWS

https://aws.amazon.com/about-aws/


AWS Whitepapers & Guides

https://aws.amazon.com/whitepapers/


AWS Cost Management

https://aws.amazon.com/aws-cost-management/

Access your monthly bill

View the overall status of your AWS costs and usage


* AWS Cost Explore

https://aws.amazon.com/aws-cost-management/aws-cost-explorer/

Explore your costs and usage


* AWS Budgets

https://aws.amazon.com/aws-cost-management/aws-budgets/

Set custom cost and usage budgets


* AWS Cost & Usage Report

https://aws.amazon.com/aws-cost-management/aws-cost-and-usage-reporting

Access comprehensive cost and usage data


AWS Total Cost of Ownership (TCO) Calculators

https://aws.amazon.com/tco-calculator/


AWS Total Cost of Ownership (TCO) Calculator

https://awstcocalculator.com/



Compare AWS Support Plans

https://aws.amazon.com/premiumsupport/plans/



보다 자세한 내용은 각 서비스의 링크를 통해 확인해 보시면 되겠습니다.

또한 whitepaper 도 꼭 읽으면 시험에 도움이 많이 됩니다. 즉, 시간이 많이 필요합니다.


모든 내용을 여기서 다룰 수가 없어서 여기에 소개되지 않은 서비스들도 있습니다.

기본 서비스 및 시험에서 나온 문제들 위주로 위에 소개했으며, 그렇지 않은 것도 많이 있다는 것을 염두에 두시기 바랍니다.





4. 정리한 자료


개념 잡기에 도움이 되는 자료

------------------------------------------------------

aws-overview.pdf

Architecting on AWS - Key Concepts.pdf


지금까지 AWS 가 제공하는 온라인 강의의 스크린 샷을 정리한 자료

------------------------------------------------------

AWS_CLF-C01_20190808_chocoball.pdf

AWS_CLF-C01_20190902_chocoball.pdf


회사 동료가 제공해준 자료를 공유합니다. 실제 시험에서 동일한 문제가 많이 나왔습니다.

------------------------------------------------------

CLF-CO1_AWS_Certified_Cloud_Practitioner_2019.zip


온라인 워크샵을 통해 강사분이 공유해 주신, 비공식 Architect - Associate 시험 자료도 참고가 많이 되었습니다. (어차피 볼 시험이라)


* serithemage/AWSCertifiedSolutionsArchitectUnofficialStudyGuide

https://github.com/serithemage/AWSCertifiedSolutionsArchitectUnofficialStudyGuide


또한, 이미 이 시험을 보신 분이, 자세히 정리해 주신 글이 있어 정독 3번 했습니다.


* AWS 자격증 시험 - 클라우드 종사자(Cloud Practitioner) 후기

https://yongho1037.tistory.com/783





5. 시험 등록


aws.training 사이트에서 Certification 메뉴에 들어가면, 시험 등록 사이트로 점프 합니다.



등록이 되지 않았으면 등록해 주시구요.



이번에는 PSI 시험장에서 시험을 봤습니다. 이상하게도 Pearson VUE 시험장은 찾을 수 없었습니다.



시험장과 시간을 지정하고, 신용카드로 결제 합니다. 세금 포함 12만 5천 4백원이 PSI 및 Amazon 수익으로 갔습니다.






6. 시험 당일


아침 5시반에 일어나 정갈한 마음으로 목욕한 다음, 편안한 마음으로 집을 나섰습니다.



거의 두 달만이네요. 반갑다 KG 에듀원 아이티뱅크.



저번에 본 Pearson VUE 시험장이 이번에는 PSI 시험장이 됩니다. 이 두 시험평가 기관의 기준을 모르겠습니다.



65문제 80분 시험이었습니다만, 13분정도 남기고 끝냈습니다.

문제 은행식이 아니다 보니, 문제를 잘 읽어야 해서 시간이 넉넉하지 않았네요.


시험을 끝내고 건물 밖으로 나오니, 낡으면서 특이한 건물이 보였습니다.

혹시... 피카다리?



회사로 출근하기 위해 종로 3가에서 2가로 걸어갑니다. 거리엔 90% 어르신들과 5%의 젊은이, 5% 의 외국인이 있었습니다.

노인 비율이 갈수록 커져가는 동네가 되었네요.



흠! 이거슨! 바로 들어갑니다.



좀 이른 점심을 먹습니다. 2층에서 보니 종로 2가의 교차로가 잘 보이네요.



저의 기억에 남아있는 종로는 대학생 때라, 20년도 더된 옛날입니다. 정말 많이 바뀌었네요.

한화빌딩을 처음 봤습니다만, 호감가게 잘 지어진것 같습니다.





7. 시험 결과


시험결과는 PASS 였습니다. 시험 끝나자 마자 모니터에 뜹니다. 그렇지만 Microsoft 때 처럼 print 물로는 제공해 주지 않습니다.



나중에 인증 사이트에서 확인하니, 다음과 같이 업데이트 정보가 올라와 있었습니다.



역시 합격은 턱걸이가 제맛이죠! 1000전 만점에 727점으로 턱걸이 하였습니다.



Security 랑 Billing 부분을 더 공부하라 합니다.

다음 Architect - Associate 를 공부할 때, 이 부분을 좀더 중점적으로 봐야겠습니다.



이만하면 첫발은 성공적이었습니다.

이제 다음 시험을 위한 준비를 다시 시작합니다.


And

Software | Daum AdFit 등록해 보기

|

1. 광고


고백하자면, 이 블로그를 시작한 이유 중 하나가 본업 외에 용돈도 좀 벌어보자도 있었습니다.

지금은 광고 수입이 너무 작아, 신경쓰지 않고 자아 실현에 그 중점을 옮겼습니다만 :-)


지금까지 AdSense 만을 광고 툴로 사용해 왔습니다.


* Software | Google Analytics 를 이용한 블로그 분석

https://chocoball.tistory.com/entry/Software-Google-Analytics-blog


* Software | Google AdSense 가입 및 설정하기

https://chocoball.tistory.com/entry/Software-Google-AdSense-PC


수익을 오픈해 보자면, 3년 걸려서 30 USD 정도 수입이 생겼습니다.

이 정도 블로그에서 용돈을 생각한다면 너무 과한 욕심이죠.




2. Daum 에는 AdFit


회사 동료로부터 블로그 시작한지 얼마 되지 않아 소주 한병 마실 정도는 되었다는 정보를 입수.

저도 AdFit 을 적용하기로.


사실 광고가 너무 많으면, 글 읽는데 집중이 되지 않으니, 최소한으로 하려 했습니다만,

돈앞에 장사 없으므로, 저도 한번 AdFit 을 적용해 보기로 합니다.





3. 등록


아래 link 에서 ID 등록합니다.


* Daum AdFit

https://adfit.biz.daum.net/



뭔가 동의하는 페이지에서 동의해 주구요.



시키는 대로, 계정에 대한 정보를 다 넣어주면 됩니다.






4. 등록


이제 web page 에 광고를 삽입하기 위한 HTML code 를 얻을 차례 입니다.



저의 이 블로그에 올린꺼라고 알려 주고요.



전체 페이지에서의 위치, 크기 등을 정하고 코드를 받습니다. 



그런 다음, 블로그의 "플러그인" 메뉴에 가서 Daum AdFit 설정에 들어갑니다.



AdFit 관리 화면서에 등록한 대로, 동일한 위치와 크기의 profile 을 만듭니다.

그리고 그 profile 에 HTML code 를 복사하기 합니다.



이렇게 하므로써, 직접 HTML coding 할 필요 없이, Tistory 에서 자동으로 지원하는 플러그인이 web page 로딩시 삽입해 주게 됩니다.

넘 편해~.





5. 적용 후


적용하면, 아래처럼 의도한 대로 광고가 노출됩니다.



아래도요.



다만, Google AdSense 처럼, 광고 노출이 적절한 사이트 인지 심사가 있습니다.

심사 결과가 나오지 않아서, 첫날은 그냥 노출만 되고 실제 수익에는 반영되지 않습니다.






6. 심사 완료


3년정도 블로그에 계속 글을 올려서 인지, 하루만에 심사 패스 했습니다.

이제 돈좀 벌어 보자~!



상단 오른쪽에 하나 더 심었습니다.



각 페이지 하단에도 하나 심었구요.



한 3일 지나니 아래와 같은 그래프를 보여 줬습니다.



한 1000년 있으면 부자 될 것 같습니다.


글이 워낙 기술 기술 하다보니 재미도 없고, 유입이 없는것 같네요.

web site 에서 기술적으로 대응할 수 있는 부분은 대부분 손 본것 같고, 이제 글 내용을 조금 재미있게 쓸 수 있게 노력해 보겠습니다.


그러면서도 이 딱딱한 문체는 잘 바뀌지 않네요. 하... 고민.


And

Hardware | LED 전등 교환기

|

1. LED 전등


한창 LED 전구로 전등을 바꾸는 붐이 불 때 (아마도 2016년도 쯤), 저도 그 흐름에 동참하고 싶었습니다.

LED 는 LG Innotek 이 좋네, 삼성이 좋네, LED 모듈에는 그에 맞는 SMPS 를 구매해야 하네 등, 여러 정보를 수집했더랬습니다.


대략 제품을 정해 놓고 막상 교체할 전등 갯수에 맞는 비용을 상정해 봤더니, 그 당시 거진 40만원 선.


그냥 싼마이 현광등을 10년 이상치를 사놔도 되는 금액이었습니다.

그에 반하여 전기료에 미치는 영향은 미비. 왜냐하면 한여름 아니면 한달 전기세가 1만 5천원을 넘지 않으니.


비록 당시의 꿈을 펼치지는 못했지만, 마음속에 계속 간직하고 있었습니다. (이게 뭐라고~)





2. 쓰레기장


때는 2019년 봄, 유독 올해는 세계의 기운이 바뀐다는 2019년 봄 여느 일요일.

평소와 다름 없이 쓰레기를 버리러 가다, 쓰레기장에 버려진 LED 전등이!


이사를 새로 오면서 기존에 달린 전등을 탈거하고 수거장에 버린 듯 합니다.


으아아아아앙아아아아~~~!!!!!

바로 집으로 가지고 옵니다.



꽤나 긴 LED 모듈 입니다.



생산연도는 잘 모르겠습니다.



3P 전선 연결 커넥터도 득템 하구요.



철제로 된 베이스 판은 도로 쓰레기장에 갔다 버리고, LED 모듈이 정상인지 테스트 해봅니다.



한놈은 중간이 들어오지 않는군요.

LED 모듈은 LED chip 몇개를 한 그룹으로 나누고, 그룹끼리 전원이 병렬로 연결되어 있습니다.

그룹내 에서는 LED chip 끼리는 직렬로 연결되어 있어서, 그 중 한놈만 죽어도 저렇게 한 그룹이 나갑니다.



해체하면서 손상되었는지 위 사진처럼 손상된 chip 들이 꽤 있습니다.

누런 찌꺼기도 많아서, 1000원짜리 소독용 에탄올로 일단 씻어 놓습니다.



이번에 수거한 LED 는 길이가 길고, 손상된 LED chip 들이 많아, 회생시키고 실제 활용하려면 손이 많이 갈것 같습니다.





3. again 쓰레기장


음?!!! 몇 주 지나지 않아 또다른 LED 전등이 쓰레기장에 버려져 있었습니다.



이 친구는 군데군데 chip 이 아예 타버렸네요.



탄게 아니라 거의 폭발 수준.



기판에도 폭발시의 열기로 변형되어 있는 부분이 있습니다.



전원 커넥터는 분리하다가 바스라져 버리네요.

강력본드로 복구는 해 놓습니다.




전등 제조사에서 붙여놓은 스펙입니다.

소비전력이 명기되어 있지 않습니다만, 정격 입력전력이 사용되는 전력일까요? 그렇다면 꽤나 많은 양이네요.



컨버터 용량을 보니 3개 해서 90W 는 사용할 것 같습니다.

생산연도는 2016년 입니다.



일단 살아있는 놈 하나 건집니다.






4. 필요한 부품 구매


기존 형광등 하우징에 설치되어 있는 형광등 부품을 제거하여 공간을 마련하고, 아래 그림처럼 LED 모듈을 자석으로 고정하도록 합니다.



단, 위처럼 생긴 자석은 그리 센것이 없어서,

네오디뮴으로 되어 있고, 중앙에 구멍이 뚫려 있어 볼트를 이용해서 스페이서와 고정할 수 있는 자석을 구입할껍니다.


우선 얼마나 LED 모듈 기판을 띄울 것인지, 기존 거실 현광등의 하우징을 측정해 봅니다. 깊이는 42mm.



기존 control box 의 높이는 21mm.



그렇담, 25mm 정도를 띄워 주면 되겠군요.


우선 하우징 철판에 고정할 수 있도록, 네오디움 자석을 구입합니다. 높이는 3mm.

구매시 주의할 점은, 너트를 끼워도 높이에 영향가지 않도록, 가운데가 오목한 제품을 선택해야 합니다.


* 5/10/20pcs 10 x 3mm Hole: 3mm Ring Neodymium Countersunk Magnets 10x3 Super Strong Rare Earth Magnet 10*3-3

https://www.aliexpress.com/item/32955383709.html



크기가 10mm 가 적당한지, 12mm 가 적당한지 몰라, 두 가지 모두 일단 10개씩 구입합니다.


* 10pcs 12 x 3 mm Hole 3 mm Super Strong Ring Loop Countersunk Magnet Rare Earth Neo Neodymium Magnets Cylinder 3mm

https://www.aliexpress.com/item/32954005998.html



붙을 수 있는 금속이 근처에 있으면 무섭게 달라 붙기 때문에, 꽤 두꺼운 뽁뽁이에 쌓여져 배달되었습니다.



우선 10mm 짜리가 왔습니다.

특별히 문제는 없지만, 철판과 닿는 면적이 작아서 그렇게까지 세게 붙어있지 않습니다.



나중에 12mm 짜리가 와서 모두 장착해 봤더니, 딱 맞는 세기로 잘 붙었습니다.

여러분들도 동일한 작업시에는 12mm 짜리 구입하세요.


다음으로는 대가리가 평평한 볼트 입니다.


* 50pcs M1 M1.2 M1.4 M1.6 M2 M2.5 M3 M4 Mini Micro Small Black 304 Stainless steel Cross Phillips Flat Countersunk Head Screw Bolt

https://www.aliexpress.com/item/32975242274.html



있어보이게 black zinc 로 된 제품으로 구입했습니다.



볼트 헤드가 납짝해야 자석과 채결 시, 네오디뮴 자석이 철판에 닿는 것을 방해하지 않습니다.



볼트의 내 직경이 3mm 짜리를 M3 로 칭하는 것 같습니다. 모든 부품들을 M3 나 3mm 로 통일합니다.


불트를 구매했으니 너트도 필요하겠죠?


* 50pcs/20pcs/lot Nylon Lock Nut DIN985 M2 M2.5 M3 M4 M5 M6 Steel With Black OR White Znic

https://www.aliexpress.com/item/32844861148.html



너트 안에 고무가 있어, 잘 풀어지지 않는 너트를 구입했습니다.



스페이서는 22mm 짜리를 구매합니다. 그래야 22mm (스페이서) + 3mm (자석) = 25 mm 라는 계산이 나옵니다.


역시 동일하게 M3 형식입니다.

한 끝쪽에 3mm 볼트를 채결할 수 있도록 되어 있습니다. 설명에는 6mm 가 파여있다고는 하지만, 더 파져 있습니다.


* 50Pcs M3*5/6/8/10/12/14/16/18/20/25+6mm Hex Nut Spacing Screw Brass Threaded Pillar PCB Computer PC Motherboard Standoff Spacer

https://www.aliexpress.com/item/32823612285.html



볼트 + 스페이서 + 너트를 채결하면 다음과 같습니다.





5. 기존 부품 제거


기존 현광등과 관련된 전선을 제거합니다.



LED 흉내만 내고 1년이 안되어서 죽어버린 LED 형광등을 제거합니다.



안정기와 소켓, 그리고 지지대 등이 제거되니 깔끔해 집니다.






6. LED 모듈 장착


먼저 도착한 10mm 직경 자석이 사진에서 오른쪽, 12mm 가 왼쪽 입니다.

10mm 도 괜찮지만, 좀더 확실히 하기 위해 모두 12mm 네오디뮴 자석으로 교체합니다.



중앙이 움푹 파인 자석을 구매했지만, 패이지 않은 자석이 하나 있네요. QA 가 대충인 결과입니다.



전원 커넥터에 쉽게 삽입이 될 수 있게, DC 컨퍼터의 전선 끝을 납땜해 줍니다.



DC 전원 컨버터 다리에도 자석을 붙여서 하우징 철판에 붙여 줍니다.

딱 소리 나면서 잘 붙는게 기분 좋네요. 위치가 마음에 안들면 요리조리 움직여도 됩니다. Neodymium 자석 넘 좋아요.



접지도 잊지 않고 해 줍니다. 사진에서 녹색 전선이 접지 입니다.



LED 모듈 본체 부착!

따따닥~! 하면서 고정되었습니다.



한가지 아쉬운 점은 길이가 맞지 않아 윗 사진처럼 비틀어서 넣어야 한다는 것.



겉유리 마저 채결하면 작업 끝 입니다.





7. 마무리


부품 수급 과정이 오래 걸렸지만, 막상 작업시에는 문제 없이 끝났습니다.



아핫 깔끔 하군요.

거추장 스러웠던 예전 부품들을 버리고 내부가 깔끔해 진 것 같아서 기분이 좋습니다.


다만, LED 라고 해도 열이 꽤 있네요. 열이 잘 빠져나갈 수 있는 구조가 아니다 보니, 조금 걱정이 됩니다.

애초 디자인 부터 열배출을 감안하고 등가구들을 만들어 주면 어떨까 하는 생각이 매번 듭니다.


전등을 손볼 때 마다 드는 생각이, 나만의 등기구를 만들어 보고 싶다 입니다.

기능적 구조에서 디자인 까지 마음에 쏙 드는 제품을 찾아보기 힘든게 등가구 아닌가 싶습니다.

마음같아서는, 열 배출이 잘되는 등기구의 하우징, DC 컨버터 모듈 커버 및 회로 디자인, LED 모듈 디자인 등을 직접 해보고 싶네요.



이 작업 했다고 이 난리가 되었습니다.


And

Hardware | 555 chip 알아보기 - 1

|

1. History


원래는 4x4 DIP socket 이 필요해서 찾아보던 중, 555 chip 에 소켓도 같이 딸려오는 패키지가 있어, 555 를 접하게 되었습니다.

이 555 chip 은 아날로그를 디지털화 시켜주는 chip 으로써, 개발하신 분도 이렇게까지 널리 사용될 줄은 몰랐다고 합니다.


1972년에 소개된 것이, 지금도 여전히 많이 사용되고 있고, 그 갯수가 한해 10억개에 이른다 합니다.


기본적인 사용처로는, timer, pulse generation, 그리고 oscillator 등에 사용된다고 합니다.

사용법은 간단하여, 입력단의 저항과 캐패시터, 또는 스위치를 이용하여 output 을 조절한다고 합니다.


* 555 timer IC

https://en.wikipedia.org/wiki/555_timer_IC






2. 구매


원래 DIP socket 구매의 주 목적은, ATtiny85 flashing 시, 잘못된 fuse bit 를 flashing 하게 되면 ATtiny85 가 벽돌이 됩니다.

이를 환생시켜 주기 위해서는 9~12V 를 이용하여 chip 을 reset 해줘야 하는 데, 그 회로를 만들기 위해 4x4 DIP 소켓이 필요했습니다.

아래 글에서 나와 있듯이 ATtiny85 를 Digispark 로 만들어 보면서 필요하게 된 내용 입니다.


* Hardware | ATtiny85 개발 보드를 이용하여 Digispark 를 DIY 하기

https://chocoball.tistory.com/entry/Hardware-Digispark-DIY-using-ATtiny85


뭐, 시작이 어찌 되었 건, 555 chip 을 접할 수 있는 계기가 되었으니 즐겁게 구매를 진행해 봅니다.

*  MCIGICM 20pcs , (10 each) NE555 IC 555 & 8 Pin DIP Sockets

https://www.aliexpress.com/item/32701785561.html



도착은 아래와 같습니다.



도착샷을 올리는 것은, 포스트 내용을 길게 빼기 위해서 항상 빠질 수 없는 짓 입니다.



원하는 4x4 DIP 소켓을 얻게 되었구요.



NE555 chip 이 부차적으로(?) 딸려 왔습니다. :-D



사양 문서는 아래 올려 놨습니다.

lm555.pdf





3. 기본 원리


555 에 대해서 동영상과 설명이 가장 잘 되어 있는 사이트는 아래와 같습니다.


* 555 Timer IC – Working Principle, Block Diagram, Circuit Schematics

https://howtomechatronics.com/how-it-works/electronics/555-timer-ic-working-principle-block-diagram-circuit-schematics/


언뜻 보기엔 어려워 보이지만, 전자공학과 관련된 기초적인 지식만 가지고 있으면 이해할 수 있다고 봅니다.

아래 설명들은 위의 내용을 간략해서 올려 봅니다.


555 의 물리적인 diagram 과 논리적인 diagram 은 다음과 같습니다.



논리적인 구성은 다음과 같고, 전체적으로 보면,

입력 voltage 를 나누고 > 비교하고 > Flip-Flop > 방전 시키면서 출력에 변화를 가하는 회로로 이해 할 수 있습니다.



실제 구현을 살펴 보기 전에, 전체적인 흐름을 설명하면 다음과 같습니다.



우선 Vcc 를 통해서 받은 voltage 가 모든 것의 시작이 됩니다.

아래 예에서는 12V 를 입력하여, comparators 에 들어가는 input 을 저항을 통해 6V/3V 로 바꿔서 넣어 줍니다.



Threshold / Trigger 입력단을 통해, Vcc 의 1/3, 2/3 voltage 인 6V/3V 와 비교시켜, flip-flop 의 입력으로 사용합니다.



참고로 flip-flop 은 다음 그림과 같이, NAND gate 를 가지고 논리적인 output 값을 가집니다.



저도 처음 해보는 지라, 설명을 해 놓고도 이게 뭔말인가 싶습니다.

실제로 관련된 회로를 꾸며봐야 이해하기 쉬울 듯 합니다.


우리 주위에서 가장 흔히 볼 수 있는 활용 예는, 경찰차 표시등이나, 규칙적인 전구의 점등 등이 있겠습니다.





4. Mode : Bistable


위의 동작방식을 가지고 꾸며 볼 수 있는 방법이 3가지가 있습니다.

그 중, 먼저 Bistable 모드에 대해 알아봅니다.


아래처럼 Vcc 와 Trigger / Reset 사이에 저항과 스위치를 각각 가지고 있는 회로를 보겠습니다.



우선 스위치를 누르지 않았을 때의 초기 상태는 0 이 output 으로 출력됩니다.



Trigger 스위치를 누르게 되면, comparator 가 1 로 바뀌고, 결과적으로 output state 가 1 로 바뀌게 됩니다.



그 후, Reset 스위치를 누르면, 다시 초기 상태로 되돌아 옵니다.

이는 555 chip 을 flip-flop 처럼 사용하고 싶을 때 구성하는 방식이 되겠습니다.



아래 그림처럼, Trigger 와 Reset 은,

연속적으로 입력받는다 할 지라도, 최종 output 에는 영향 주지 않으며, 상태를 계속 유지하게 됩니다.



활용도 면에서는 memory cell 이 있겠습니다. Reset 되기 전 까지는 Trigger 가 한번이라도 되면 그 값을 계속 유지하게 되니까요.





5. Mode : Monostable


Trigger 단자에는 스위치 하나와 저항 하나, 그리고 ,Threshold 에는 캐페시터가 연결되어 있고,

Discharge 단자에 이 캐페시터가 연결되어 있는 구조 입니다.



처음에는 Trigger 단자로 Vcc 가 연결되어 있으니 활성화 되어 있고,

Q-bar 와 연결된 트랜지스터가 활성화 되어 Discharge 단자로 들어오는 Vcc 가 상쇄됩니다.

결과적으로 output 은 0 인 상태이고, 회로 전체적으로 아무 변화를 일으키지 않는 상태 입니다.



이 안정된 상태에서 Trigger 스위치가 눌리면, Q-bar 상태가 0 로 변경되면서 트랜지스터가 비활성화 됩니다.

연관하여 이 트랜지스터와 연결되어 있던 Discharge 단자가 차단되고, 캐페시터에 전압이 쌓이게 됩니다.



이 캐패시터의 전압이 2/3 Vcc 에 다다르면, Comparator 에 역전이 일어나면서 전체 회로가 초기 상태로 되돌아 갑니다.



Trigger 입력으로부터 초기 상태로 되돌아가기 까지는 캐패시터와 그와 연결된 저항값에 따라 조절될 수 있습니다.

한번 입력을 넣어 놓으면, 일정 시간이 지나고 자동으로 되돌아 오는 기능이 필요시 사용되는 모드 입니다.





6. Mode : Astable


Astable 모드는 주파수 발진기로 사용될 수 있습니다.

입력받는 저항 및 캐패시터에 의해 정해지는 시간을 주기로 반복적으로 output 값이 1/0 을 나타내게 됩니다.



초기 상태는 트랜지스터가 비활성화된 상태이므로, 캐패시터에 전자가 쌓이게 되고, 1/3 Vcc 지점까지 올라갑니다.

처음 1/3 Vcc 는 Trigger 쪽 Comparator 를 1에서 0 으로 변화시키지만, Q-bar 값을 변화시키지 않으므로, 기존 상태를 유지합니다.



이제 캐패시터가 2/3 Vcc 까지 다다르게 되면, Threshold 쪽 Comparator 상태변화에 따라 최종 output 값이 0으로 바뀌게 됩니다.



이 바뀐 상태가 트랜지스터의 Discharge 회로를 활성화 시키며, 캐패시터의 전자들이 방전되기 시작합니다.

그러면서 1/3 Vcc 까지 떨어지면, 전 회로 상태가 바뀌어, 다시 output 이 1로 변경됩니다.


이제, 캐패시터 voltage 는 1/3 Vcc 에서 2/3 Vcc 사이를 왔다갔다 하면서 충방전이 일어나며, 전체 output 을 0 / 1 변하게 됩니다.

결국 주파수 신호 발생기, pulse generator 역할을 하게 됩니다.



Output 이 1인 상태로 유지하는 시간과 0 을 유지하는 시간은, 저항 2개와 캐패시터 하나의 값에 따라 정해지게 됩니다.


휴.... 이론적인 부분은 여기까지 입니다.





7. Pulse Generator


단순한 구조와 넓은 입력 voltage 값, 잘 고장나지 않는 구조때문에 적용 범위가 엄청 많이 있습니다.

이대로 끝내면 아쉬우니 Astable 상태를 가지고 pulse generation 회로를 꾸며 봤습니다.


아래 사이트를 전적으로 참고하였습니다.


* Introducing 555 Timer IC – Tutorial

연결 회로는 다음과 같습니다.


실제 전자 부품이 연결된 모양은 다음과 같습니다.



무난하게 잘 동작했습니다.

아쉬우니 동영상으로도 남겨 봅니다.






FIN


555 chip 을 알기 위해선 flip-flop 도 이해해야 하고, Op-amp 를 이용한 comparator 도 이해 해야 하고,

대학교 수업 때, 무식하게 외웠던 내용들을 이 나이 되어서야 logic 적으로 이해할 수 있는 계기가 되는 실험이었습니다.


이제 기초적인 내용을 정리해 봤으니,

앞으로는 실생활에 여전히 많이 쓰이는 555 에 대하여, 시간 날 때마다 하나씩 실험해 보겠습니다.


마지막으로, 555 에 대해 나름 유명한 cookbook 들이 있어 PDF 파일을 올려 놓습니다.


Forrest Mims - 555 Timer IC Circuits.pdf


ICTimerCookbook1stEd1977_WalterGJung.zip.001

ICTimerCookbook1stEd1977_WalterGJung.zip.002


50-555Circuits.pdf


555_basics.zip.001

555_basics.zip.002



And

Hardware | ESP-01 or ESP8266 사용기 - 5

|

이번 글을 읽기에 앞서, ESP8266 에 관하여 몇 차례에 걸쳐 다뤄 왔습니다.

ESP8266 을 활용하기 위해서는 여러 지식과 경험이 바탕이 되어야 추가적인 내용을 충분히 이해할 수 있습니다.

시간이 허락되신다면, 먼저 아래 포스팅 들을 참고해 주세요.


* Hardware | ESP-01 or ESP8266 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-1


* Hardware | ESP-01 or ESP8266 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-2


* Hardware | ESP-01 or ESP8266 사용기 - 3

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-3


* Hardware | ESP-01 or ESP8266 사용기 - 4

https://chocoball.tistory.com/entry/Hardware-ESP01-or-ESP8266-using-4



또한, 이 포스트에서 가장 많이 참고한 사이트는 여기 입니다.


* Using ESP8266 SPIFFS

https://www.instructables.com/id/Using-ESP8266-SPIFFS/





1. SPIFFS


SPI Flash File System 의 약자로서,

ESP8266 등에 장착된 Flash memory chip 의 여유공간에 파일을 쓰기/읽기/삭제 등을 할 수 있게 해주는 기능입니다.


* ESP8266 Arduino Core

https://arduino-esp8266.readthedocs.io/en/latest/filesystem.html


|--------------|-------|---------------|--|--|--|--|--|
^              ^       ^               ^     ^
Sketch    OTA update   File system   EEPROM  WiFi config (SDK)


단, 일판 file system 처럼 directory 구조처럼 하위 폴더 개념이 없고, 1차원적으로 모든 파일을 한곳에 넣어서 사용해야 합니다.



궁극적인 목적으로는,

- ESP8266 등에 장착된 controller 가, 시간과 로드가 많이 걸리는 외부 저장장치에 접근하지 않고, 내부적으로 처리하기 위한 방법

- 파일이 자주 변하지 않으며, 주로 읽혀지는 파일

- 여타 파일 시스템 처럼 bad block 등의 검사나, 마킹을 할 수 없음

- HTML, CSS, JS 파일들을 올려놓고 ESP8266 에서 web server 를 돌릴 수 있슴





2. Arduino IDE 에서 환경 설정


파일을 올리는 툴은 Arduino IDE 에서 하게 되므로, SPIFFS 를 사용할 수 있도록 Arduino IDE 를 설정해야 합니다.

우선 Arduino IDE 에서 SPIFFS 메뉴를 활성화 시키기 위해 아래 순서대로 진행합니다.



A. Plug-In 인스톨

아래 사이트에서 최신 파일을 받습니다.


* esp8266/arduino-esp8266fs-plugin

https://github.com/esp8266/arduino-esp8266fs-plugin/


* Latest version of ESP8266 Arduino

https://github.com/esp8266/arduino-esp8266fs-plugin/releases/tag/0.4.0

ESP8266FS-0.4.0.zip


혹시 모르니, 필요한 파일을 받아서 올렸습니다.



B. 파일을 설치

Arduino IDE 에서 설정된 sketch 폴더에 tools 라는 directory 를 만들어 서 그 안에 위의 파일을 해동하여 넣습니다.



sketch 폴더는 환경마다 다르므로, 현재 쓰고 있는 환경에서 sketch 폴더가 어디인지는 Preference 에서 확인 가능합니다.




C. 설치 완료 확인

설치 후, Arduino IDE 를 재시작 하여 Tools 메뉴에 가 보면,

아래 Before/After 처럼, 새롭게 "ESP8266 Sketch Data Upload" 매뉴가 활성화 된 것을 확인 할 수 있습니다.


Before



After






3. ESP8266 의 용량 확인


파일을 업로드 하기 전, ESP8266 에 달려 있는 Flash memory 의 용량을 확인해 봅니다.

사실 대략 알고 있다면 이 부분은 건너 뛰어도 됩니다.


우선 ESP8266 보드를 Arduino IDE 에서 직접 access 할 수 있도록, 보드를 등록해 봅니다.

보드 등록을 위한 관련 파일을 다운로드 받아 설치하려면, 아래 설정처럼 Preference 에 해당 정보가 등록되어 있어야 합니다.


File > Preference


https://arduino.esp8266.com/stable/package_esp8266com_index.json


아래처럼 등록하면 됩니다.

예전에 Digispark 를 DIY 한 흔적이 있네요. 다른 URL이 이미 있다면, 다음 줄에 등록하면 됩니다.



그럼, 아래 메뉴에서 ESP8266 보드 관련 파일을 설치할 수 있게 됩니다.


Tools > Board > Boards Manager



Boards Manager 에서 esp8266 으로 검색하여, 설치되어 있지 않으면 설치해 줍니다.



여기까지 왔다면, Board 메뉴에서 Generic ESP8266 Module 을 선택할 수 있게 됩니다.



특별히 할 설정은 없슴니다만, SPIFFS 를 2M 사용한다고 설정 했습니다.

다른 설정은 잘 모르겠네요.



이제 Flash memory 확인용 sketch 를 선택합니다.


File > Examples > ESP8266 > CheckFlashConfig



실제 소스는 다음과 같습니다.


/*
  ESP8266 CheckFlashConfig by Markus Sattler
  This sketch tests if the EEPROM settings of the IDE match to the Hardware
*/

void setup(void) {
  Serial.begin(115200);
}

void loop() {

  uint32_t realSize = ESP.getFlashChipRealSize();
  uint32_t ideSize = ESP.getFlashChipSize();
  FlashMode_t ideMode = ESP.getFlashChipMode();

  Serial.printf("Flash real id:   %08X\n", ESP.getFlashChipId());
  Serial.printf("Flash real size: %u bytes\n\n", realSize);

  Serial.printf("Flash ide  size: %u bytes\n", ideSize);
  Serial.printf("Flash ide speed: %u Hz\n", ESP.getFlashChipSpeed());
  Serial.printf("Flash ide mode:  %s\n", (ideMode == FM_QIO ? "QIO" : ideMode == FM_QOUT ? "QOUT" : ideMode == FM_DIO ? "DIO" : ideMode == FM_DOUT ? "DOUT" : "UNKNOWN"));

  if (ideSize != realSize) {
    Serial.println("Flash Chip configuration wrong!\n");
  } else {
    Serial.println("Flash Chip configuration ok.\n");
  }

  delay(5000);
}


!!주의!!

ESP8266 의 Flash memory 에 writing 하기 위해서는 아래 순서에 맞게 해야 합니다.


1. RST 의 스위치를 누른다.

2. FLASH 의 스위치를 누른다.

3. RST 의 스위치에서 손을 뗀다.

4. FLASH 의 스위치에서 손을 뗀다.

5. Flash program 에서 "시작" 을 누른다.



위의 구성처럼, 꼭 외부 전원으로 ESP8266 을 구동시키는 것과,

PC 와 Serial 연결 위한 FTDI 나 CP2102 의 GND 를, 외부전원의 GND 와 서로 연결해 주는 것을 빼먹으면 안됩니다. (동기)


FTDI 는 Serial 통신만을 위한 것이지, ESP8266 의 전원까지 공급하게 하면, 매우 높은 확률로 실패합니다.



컴파일된 sketch 가 잘 밀어들어가고 있고요.



문제 없이 끝났습니다.

Hard resetting via RTS pin... 이라고 나오고, 그 뒤 반응에 대한 내용은 나오지 않습니다.



Serial Monitor 로 확인해 보면, 올라간 sketch 가 잘 구동되는 것을 확인할 수 있습니다.

원래 1MB 였던 Flash memory 가 4MB 로 변경된 것이 확인 됩니다.





4. SPIFFS upload


이제 아까 Plug-in 을 이용해 구현했던 "ESP8266 Sketch Data Upload" 기능을 이용하여 실재로 data upload 를 해 봅니다.

sketch 폴더에 "data" 폴더를 만들고, 거기에 파일을 놔두면, 그 파일이 자동으로 upload 된다고 합니다.



으잉? 빈 깡통이라고 그러네요?

이미 위에서 알고 있는 sketch folder 와 또 다른 곳을 이야기 하는 듯 합니다.

IDE 메뉴의 "Show Sketch Folder" 를 이용하여 어디를 이야기 하는지 확인해 봅니다.


Sketch > Show Sketch Folder



Sketch 폴더가 여기였어? 이 SPIFFS 업로드용 sketch 폴더는 Temp 폴더로 잡혀있나 보네요.

data 폴더를 만들어 주고 업로드 하고 싶은 파일을 심어 놓습니다.



드디어 이 메뉴를 눌러 봅니다.



"SPIFFS Uploading Image..." 라고 뜨면서 막 뭐를 밀어 넣는 것 같습니다.



"SPIFFS Image Uploaded" 라고 뜨면서, "Hash of data verification" 까지 실행하고 끝납니다.

텍스트 파일이라서 그런지 data 압축도 자동으로 되는 것 같습니다.



Data upload 영역과 기존 firmware 영역이 잘 분리되어 있는지, 전원을 리셋하여 command 를 날려 봅니다.

기존 Wi-Fi firmware 영역은 완벽히 구분되어 잘 보존되어 있네요.



아래 그림에서 보이듯, SPIFFS 가 사용하는 File System 영역과 Program 영역이 분리되어 있는지 확인해 본 것입니다.





5. Upload 된 파일 확인


그럼 upload 되어 있는 파일이 진짜 내가 올린 파일인지 확인해 볼까요?

이 글, 맨 처음에 참조한 사이트에서 text 파일 확인용 소스가 있습니다. 그대로 활용해 봅니다. (Steve 고마워요~)


/* Steve Quinn 06/03/17
Copyright 2017 Steve Quinn

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

 This program is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 GNU General Public License for more details.

 You should have received a copy of the GNU General Public License
 along with this program.  If not, see .

Written to accompany the following Instructable;

'Using ESP8266 SPIFFS'

Compiled using Arduino 1.6.9 
*/

#include "string.h"
#include "FS.h"

bool    spiffsActive = false;
#define TESTFILE "/esp8266_SPIFFS.txt"

void setup() {
	Serial.begin(115200);
	delay(1000);
	
	// Start filing subsystem
	if (SPIFFS.begin()) {
		Serial.println("SPIFFS Active");
		Serial.println();
		spiffsActive = true;
	} else {
		Serial.println("Unable to activate SPIFFS");
	}
	
	delay(2000);
}

void loop() {
	if (spiffsActive) {
		if (SPIFFS.exists(TESTFILE)) {
			
			File f = SPIFFS.open(TESTFILE, "r");
			if (!f) {
				Serial.print("Unable To Open '");
				Serial.print(TESTFILE);
				Serial.println("' for Reading");
				Serial.println();
			} else {
				String s;
				Serial.print("Contents of file '");
				Serial.print(TESTFILE);
				Serial.println("'");
				Serial.println();
				
				while (f.position() < f.size()) {
					s=f.readStringUntil('\n');
					s.trim();
					Serial.println(s);
				}
				f.close();
			}
			Serial.println();
			
			f = SPIFFS.open(TESTFILE, "a");
			if (!f) {
				Serial.print("Unable To Open '");
				Serial.print(TESTFILE);
				Serial.println("' for Appending");
				Serial.println();
			} else {
				Serial.print("Appending line to file '");
				Serial.print(TESTFILE);
				Serial.println("'");
				Serial.println();
				f.println("This line has been appended");
				f.close();
			}
			
			f = SPIFFS.open(TESTFILE, "r");
			if (!f) {
				Serial.print("Unable To Open '");
				Serial.print(TESTFILE);
				Serial.println("' for Reading");
				Serial.println();
			} else {
				String s;
				Serial.print("Contents of file '");
				Serial.print(TESTFILE);
				Serial.println("' after append");
				Serial.println();
				
				while (f.position() < f.size()) {
					s=f.readStringUntil('\n');
					s.trim();
					Serial.println(s);
				}
				f.close();
			}
		} else {
			Serial.print("Unable To Find ");
			Serial.println(TESTFILE);
			Serial.println();
		}
	}
	
	while (true) {
		yield();
	}
}


프로그램 영역에 올려야 구동되므로, IDE 에서 일반 sketch upload 로 밀어 넣습니다.

프로그램이 올라가면 Serial Monitor 를 통해 확인해 봅니다.



제가 작성했던 text 파일이 잘 읽혀지네요. 신기~!



한글 및 ASCII 코드도 잘 읽혀서 변환되었습니다. (OS 가 한글이기도 하고, 파일 인코딩을 UTF-8 로 지정함)



이 소스는 Flash memory 에서 SPIFFS 를 사용하여,

일반 file system 의 IO 처럼, 추가 쓰기가 가능하다는 것을 보여주기 위해 append 기능이 부여되어 있습니다.



이 과정을 통해 기존 firmware 위에 확인용 sketch 가 overwrite 되었으므로,

다시 Wi-Fi firmware 를 입혀주고, 그렇게 해도 여전히 data 영역이 그래도 보존되는지 확인해 봅니다.



그 다음, 다시 위의 소스 sketch 를 입히고 실행시켜 보니, 아래와 같이 한줄 더 추가 되었습니다.



즉, data 영역은 프로그램 용 sketch 나, Wi-Fi firmware 와는 완전 분리된 상태로 관리 되고 있다는 것을 알 수 있습니다.





FIN


ESP8266 에 대해서 5회에 걸쳐 살펴봤습니다.

대략적인 사용법 - 개념, 환경 구성, Flash memory 사용법 - 은 훑어 본것 같습니다.


ESP8266 의 진정한 활용은 무선으로 연결하여 IoT data 나, 실시간 연결을 통한 제어가 주 목적이 되겠습니다.

다음부터는 센서를 가지고 놀면서, IoT 적인 활용법을 익혀 보겠습니다.


And

Hardware | ZP07-MP901 공기질 측정 센서

|

1. 공기 질


예전 80년대 개그 프로그램 중, 스위스 공기를 깡통에 넣어 파는 일화가 있었습니다.

사실 확인이 안되니, 서울 공기를 넣어서 파는 사기를 개그로 풀어놓은 내용이었던걸로 기억해요.


그 당시 꼬꼬마였던 저는, 그 당시 상상을 뛰어넘는 내용이라 아직도 그 이미지를 강하게 기억하고 있습니다.

하긴, 물을 사먹는 시대가 온다는 예전 이야기가 현실로 된 지금은, 공기도 사먹는 날이 올지 모르겠습니다.


현실적으로 PM2.5 라는 단어가 바짝 친근해진 요즈음, 공기의 질을 신경써야 하는 시대가 온건 확실해 보입니다.






2. ZP07-MP901 센서


우연한 기회에 이 센서를 얻을 기회가 생겼습니다.

사실은 다른 공기질 측정 센서를 구입했는데, 이게 배달 되어 왔죠.



그때 당시에는 정보가 하나도 없어서, 사용을 못 하고 있다가,

이와 비슷한 센서인 ZP01-MP503 를 기준으로 만든 소스코드를 일전에 발견하여 이번에 사용해 보게 되었습니다.



도착은 이런 비닐 속에 포장되어 왔습니다.

배송 보내준 사람이 얼마나 일을 하기 싫었는지 상상하기 어렵지 않았습니다.



PCB 뒷면에는 컨트롤러 칩이 있고, 윗면에는 센서가 부착되어 있습니다.



ZP07-M901 은 ZP01-M503 보다는 좀더 복잡하게 부품들이 실장되어 있어서, 한단계 위의 제품인 듯 합니다.

아래 사진이 ZP01-M503 입니다.






3. 사양


스펙은 다음과 같습니다.


ZP07-MP901 Air Quality Module V1.1.pdf



위의 PDF 사양서에서 표기되어 있습니다만, 이 센서의 사용에 있어서 주의점 들이 몇가지가 있습니다.



사용전에 예열을 5분정도 꼭 하라고 합니다.

공기질 측정용 센서들은 대부분 센서를 가열하여 공기를 내부에서 태워서 측정하는 듯 합니다.


그래서, 휘발성 물질이 많은 곳에서는 사용을 금하라고 되어 있습니다.


한가지 아쉬운 것은, 측정은 다음 물질들이 가능하나, 공기중의 각 성분 비율을 보여주지 못하고,

밀도 측정을 통한 공기질 좋다/나쁘다 만을 알려줄 수 있습니다.


---------------------------------

formaldehyde, benzene, carbon monoxide, ammonia, hydrogen,alcohol, smoke of cigarette, essence & etc.

---------------------------------


온갖 안좋은 것들을 감지할 수 있군요.





4. 연결


Arduino 와의 연결은 다음과 같이 합니다.


 ZP07-MP901 | Arduino Nano
---------------------------
    VCC     |     5V
    GND     |     GND
     A      |     D8
---------------------------

공기 질의 결과 척도는 A pin 에서 digital 로 output 됩니다.

B pin 은 공장에서 사용하는 pin 으로, 측정시 사용되지 않습니다.



실재로는 빵판을 사용하지 않고 pin 들을 바로 연결했습니다.






5. 소스


ZP07-M503 (사실 이런 제품은 없슴) 용 소스 이지만, ZP07-M901 에서 완벽하게 동작합니다.


* Arduino test air quality class module ZP07-MP503 test

https://www.cnblogs.com/aiyauto/p/7388926.html


이 센서는 A pin 에서 오는 신호의 주기에 따라서 구분을 합니다.



그래서 아래 소스를 보면, 대부분이 시간의 delta 값을 찾는것으로 되어 있습니다.


//
// Author: Aiyauto
// VERSION: 0.0.1     
// Date:2017/08/16
// PURPOSE: ZP07_MP503 Air Quality Module Detection Example for Arduino
// 
 
int airQuality;  // Air quality level 0-10 
 
void setup() {
   Serial.begin(9600);
}

void loop() {
  airQuality = ZP07_MP503(8);
  Serial.print("   Current air quality rating: ");
  Serial.println(airQuality);
}
 
int ZP07_MP503(int pinA) {
  
  /* Initial */
  pinMode(pinA, INPUT);
  unsigned long millisTimes = millis();
  unsigned long startMillisTimes = millisTimes;
  
  unsigned long stopMillisTimes;
  signed long deltaMillisTimes = millisTimes - startMillisTimes;
  bool turnState = false;
  bool pinAstate = digitalRead(pinA);
  bool pinAstateLast = pinAstate;
  int result;
  
  /* test read status */
  while (true) {
    pinAstate = digitalRead(pinA);  // Read pin status
    
    if(pinAstate != pinAstateLast) {
      if (turnState == true ) {
        stopMillisTimes = millis();
        if (pinAstate == false ) {
          deltaMillisTimes = stopMillisTimes - startMillisTimes;
        } else {
          deltaMillisTimes = 98 - stopMillisTimes + startMillisTimes;
        }
        
        result = (deltaMillisTimes + 5 ) / 10;  // computation result is rounded
        break;  // out of the loop
      }
      if (turnState == false ) {
        startMillisTimes = millis();  // refresh the current time
        turnState = true; // update flag
      }
      pinAstateLast = pinAstate;
    }
    
    millisTimes = millis();
    deltaMillisTimes = millisTimes - startMillisTimes;
    if ( deltaMillisTimes > 100 ) { // The result is judged, the timeout jumps out of loop
      if (pinAstate == true) {  // air quality level 10
        result = 1;
      }
      if (pinAstate == false) { // air quality level 0
        result = 0;
      }
      
      break;
    }
  }
  
  // Serial.print(" pinAstate:");
  // Serial.print(pinAstate);
  // Serial.print(" , Air Quality Rating:");
  // Serial.print(result);
  // Serial .print(", deltaMillisTimes:");
  // Serial.println(deltaMillisTimes);
  
  return result;  // return air quality level result
}





6. 결과


위의 소스에서 pinAstate 및 deltaMillisTimes 도 표시하도록 조금 변경해서 측정해 봤습니다.

물론 전원 연결하고 5분 뒤에 말이죠.


...
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:11
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:9
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:1, deltaMillisTimes:10
Current air quality rating : 1 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
Current air quality rating : 0 | pinAstate:0, air quality level:0, deltaMillisTimes:101
...


위는 센서에 대해 숨을 내쉬었더니 값의 변화가 있었습니다.

그럼 더 쎈건 없을까... 주변을 보던 중, 땀났을 때 몸을 닦는 샤워 페이퍼를 발견합니다.

저번 출장갔을 때, 하나 사다 놓은 것.


몸에 문지르면, 땀도 제거하고 몸이 깨끗해 짐을 느끼게 해주는 물티슈 같은 것 입니다.



성분을 확인 해봤습니다.



에탄올, 멘톨, PPG-6데실테트라데세스-20, 디이소스테아린산PEG-20글리세린, 향료 가 들어 있다고 합니다.

나름 자극도 쎄고, 알콜 냄새가 강하게 나므로, 센서에서 뭔가 반응이 올 듯 합니다.



샤워 타월 한장을 꺼내서 몸좀 닦고 센서 코앞에 갔다 댑니다.


음? 처음에는 왜이리 반응이 안오지? 했습니다.

뭔가 잘못 되었나?


한~~ 참을 있으니 반응이 오는군요.



이렇게 반응이 늦어서 괜찮을까 싶을 정도로 늦습니다.

그래도 뱉어 내는 값은 나름 정확한 듯 합니다.


센서의 스펙 대로라면, delta time = 0ms 가 공기질 좋음 인데, 현실적으로 0ms 의 delta time 을 만들어 낼 수 없으므로,

101ms 이상을 공기질 제일 좋은 0 으로 설정한 것 같습니다.


스펙상으로는 100ms 에서 제일 나쁜 10이 설정되어 있습니다만, 이미 101ms 이상에서 0을 설정해 놨으므로,

이 소스를 가지고는 0~9 까지만 확인할 수 있겠네요.


90ms 대를 10으로 하면 될 것 같은데, 90ms 대의 값이 이 소스를 가지고 도출되지 않더군요.

Source code 를 손 보면 될것 같기도 한데, 귀찮아서 여기서 분석은 그만하기로 해요.


그래프가 빠지면 서운하니 그려 봤습니다.



갑짜기 그래프가 치솟는 것은 워낙 샤워 페이퍼 강도가 쎄서 그런것 같구요,

한번 반응하기 시작 하면, 완전히 그 단계를 벗어날 때 까지 유지하면서 값을 변경하는 것 같습니다.


즉, 실시간으로 민감하게 반응하기 보단, 충분히 그 상황으로 바뀌어야 반응하는 듯 합니다.

이 센서의 감도와 반응 형태를 보고, 그 환경에 맞게 활용하는 것이 중요해 보이네요.


오늘도 잘 놀았습니다.


And

Hardware | ADS1115 16bit 4채널 ADC 를 사용해 보자

|

1. 16 bit ADC


ADC 는 Analog to Digital Converter 의 약자로서, 입력받는 값에 대해 digital 로 표현해 줍니다.

Arduino 에는 이 ADC 가 장착되어 있어서 analog input 에 입력받은 신호에 대해 digital 로 leveling 을 해서 보여줍니다.

즉, analog 값을 digital 로 변환해서 보여주는 것이죠.


참고로, arduino nano 에는 10 bit ADC 가 장착되어 있어서 10 bit (0 ~ 1023) 값으로 표현해 줍니다.


다 좋은데, 민감한 sensor 를 다룰 때에는, 이 10 bit ADC 가 아쉬울 때가 있습니다.

좀더 정밀한 값을 들여다 보고 싶은데, 값과 값의 사이값을 알수가 없는거죠.


이 때 등장하는 것이 외부 ADC 모듈 입니다.

AliExpress 와 arduino 를 사랑하는 사람들의 blog 를 보니 ADS1115 라는 것을 많이 사용하는 군요.


ADS1115 는 Texas Instruments 사의 chip 을 사용한 16 bit ADC 입니다.


ads1115.pdf


- Resolution: 16 Bits

- Programmable Sample Rate: 8 to 860 Samples/Second

- Power Supply/Logic Levels: 2.0V to 5.5V

- Low Current Consumption: Continuous Mode: Only 150µA Single-Shot Mode: Auto Shut-Down

- Internal Low-Drift Voltage Reference

- Internal Oscillator

- Internal PGA: up to x16

- I2C Interface: 4-Pin-Selectable Addresses

- Four Single-Ended or 2 Differential Inputs

- Programmable Comparator


아래 link 의 제품이 적당해 보이네요. 구매합니다.


* I2C ADS1115 16 Bit ADC 4 channel Module with Programmable Gain Amplifier 2.0V to 5.5V for Arduino RPi

https://www.aliexpress.com/item/32850495005.html






2. 도착


그간 업무로 정신 없었는데, 어느샌가 도착했습니다.



블로그 내용을 부풀리기 위해서라도 항상 도착샷을 올리는건 필수 입니다.



저렇코롬 생겼구요.



ALERT 와 ADDR 에 pinheader 는 남겨 놓고 납땜하기로 합니다. 그 덕에 2 pinheader 하나 득템.

그 이유는 이 밑에 설명.





3. Addressing


이 ADS1115 는 I2C 통신을 하는데, 하나의 arduino 와 4개까지 연결할 수 있다 보니, I2C 접근 주소가 겹치지 않게 할 수 있습니다.

방법은 ADDR pin 을 어디로 연결하느냐로 address 를 결정할 수 있습니다.


Adafruit 4-Channel ADC Breakouts

https://learn.adafruit.com/adafruit-4-channel-adc-breakouts


- 0x48 (1001000) ADR -> GND

- 0x49 (1001001) ADR -> VDD

- 0x4A (1001010) ADR -> SDA

- 0x4B (1001011) ADR -> SCL


회로를 꾸밀 때 마다, address 정의를 위한 연결을 해도 되지만, 귀찮겠죠?

또한, addressing 을 위해 I2C 용 핀이나, VCC 로 연결하면 왠지 껄끄럽습니다.


그래서 ground 로 연결하여, 기본 0x48 을 가지게 합니다.

또한, 아래 새다리님의 블로그를 보면, 이 연결을 가장 깔끔하게 처리하셨더군요. 따라쟁이는 바로 따라해 봅니다.


* 16비트, 4채널 ADC ADS1115 아두이노 Test

https://m.blog.naver.com/twophase/220801664646


예전에 파손된 멀티탭 전원선에서 동선 한가닥을 짧게 잘라 내어 아래와 같이 납땜 해 주섰습니다.

캡톤 테이프로 혹시 모를 쇼트를 방지했구요.



i2cdetect 로 addressing 이 잘 되었나 확인해 봅니다.


     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


흠흠. 잘 되었네요.




4. Layout


* Arduino ADS1115 Module Getting Started Tutorial

http://henrysbench.capnfatz.com/henrys-bench/arduino-voltage-measurements/arduino-ads1115-module-getting-started-tutorial/


위의 tutorial 사이트에서 보면 ADS1115 를 활용하여, arduino 자체 3.3V 출력을 세밀하게 검증해 보는 소스가 있습니다.

따라쟁이는 당연 따라서 검증해 봅니다.


연결은 I2C 용 연결 2가닥과 VCC/GND 그리고, 입력용에 arduino 3.3V output 을 연결합니다.


 ADS1115 | Arduino Nano
------------------------
    VCC  |      5V
    GND  |      GND
    SCL  |      A5
    SDA  |      A4
    A0   |      3.3V
------------------------


그림으로 그려보면 다음과 같습니다.






5. Sketch


이미 관련한 library 가 나와 있기 때문에, library 를 설치합니다.

역시 God Adafruit. 없는게 없습니다.



ads1115 로 검색하면 나오지 않고, ads1x 로 검색해야 나옵니다.


이제 HENRY'S BENCH 에서 Henry 아저씨가 arduino 3.3V output 에 대해, ADS1115 를 검증해 놓은 소스를 사용해 봅니다.


#include "Wire.h"
#include "Adafruit_ADS1015.h"

Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;

void setup(void) {
	Serial.begin(9600);
	ads.begin();
}

void loop(void) {
	int16_t adc0;	// we read from the ADC, we have a sixteen bit integer as a result
	
	adc0 = ads.readADC_SingleEnded(0);
	Voltage = (adc0 * 0.1875)/1000;
	
	Serial.print("AIN0: ");
	Serial.print(adc0);
	Serial.print("\tVoltage: ");
	Serial.println(Voltage, 7);
		
	delay(1000);
}


이 소스에서 가장 중요한 것은 PGA (Programmable Gain Amplifier) 값 입니다.

이 ADS1115 의 default output 최대값이 6.144V 이므로, 이를 15 bit (16 bit 이지만, 부호를 표시하는 1 bit 를 빼면 15 bit 만 활용 가능) 인 32767 로 나누면, 출력 1 에 대해 0.1875mV 라는 계산이 나옵니다.


In the default mode, the setting is +/-6.144 volts.

Thus the value of 32767 would represent a value of 6.144 volts.

Dividing 6.144 volts by 32767 yields a scale factor of 0.1875 mV per bit.   This is a significant improvement over the Arduino ADC which resolution of approximately 5 mV per bit.  In fact, its about 26 times better!


위의 로직이 소스에 활용되었습니다.





6. 결과


지금까지 구성한 layout 과 위의 소스를 가지고 실행해 보면 다음과 같이 결과가 나옵니다.



3.3V 이지만, 미세하게 값이 변하고 있다는 것을 알 수 있습니다.

이게 USB 를 통해서 연결하지 않고 Power source 를 통해서 입력 받으면 좀더 정확하고 잘 변하지 않는 3.3V 를 얻을 수 있다고 해요.





7. 비교


Arduino nano 의 자체 3.3V 를 16 bit ADC 를 거치지 않은 채로, anlogRead (10 bit ADC) 를 하면 어떨까?


참고로 Arduino 의 AnalogReference 의 정의는 다음과 같습니다.

--------------------------------

Arduino AVR Boards (Uno, Mega, Leonardo, etc.)

- DEFAULT: the default analog reference of 5 volts (on 5V Arduino boards) or 3.3 volts (on 3.3V Arduino boards)

- INTERNAL: an built-in reference, equal to 1.1 volts on the ATmega168 or ATmega328P and 2.56 volts on the ATmega32U4 and ATmega8 (not available on the Arduino Mega)

- INTERNAL1V1: a built-in 1.1V reference (Arduino Mega only)

- INTERNAL2V56: a built-in 2.56V reference (Arduino Mega only)

- EXTERNAL: the voltage applied to the AREF pin (0 to 5V only) is used as the reference.

--------------------------------


AnalogReference(DEFAULT) 를 사용하여, 5V 기준으로 입력값을 leveling 하게 했으며,

arduino nano 에는 PGA 가 없으므로, 단순히 5V 를 10 bit ADC 해상도를 감안하여, 1024 로 나누어, 한 level 당, 0.0049 V 로 계산하도록 했습니다.



최종 소스는 다음과 같습니다.


#include "Wire.h"
#include "Adafruit_ADS1015.h"
 
Adafruit_ADS1115 ads(0x48);
float Voltage = 0.0;
float Voltage2 = 0.0;	// analogRead(A2)
 
void setup(void) {
    analogReference(DEFAULT);
    Serial.begin(9600);
    ads.begin();
}
 
void loop(void) {
    int16_t adc0;   // we read from the ADC, we have a sixteen bit integer as a result
     
    adc0 = ads.readADC_SingleEnded(0);
    Voltage = (adc0 * 0.1875)/1000;
     
    Serial.print("AIN0: ");
    Serial.print(adc0);
    Serial.print("\tVoltage: ");
    Serial.print(Voltage, 7);

	// analogRead(A2) start
    int16_t adc2;
    adc2 = analogRead(A2);
    Voltage2 = (adc2 * 0.0049);
    
    Serial.print("\tAIN2: ");
    Serial.print(adc2);
    Serial.print("\tVoltage2: ");
    Serial.println(Voltage2, 7);
    // analogRead(A2) end
         
    delay(1000);
}


결과값은 이렇게 나왔네요. 많이 부정확 합니다.


그 원인으로는,

- 5V reference 전압이 USB 를 통해 공급받으며, USB 전원은 불안하게 공급받습니다.

- PGA 가 없이, 단순히 5V reference 전압을 10 bit 로 나눈 값을 기준값으로 정했습니다.

- 16 bit 하고는 비교도 안되는 10 bit 해상도 차이가 납니다.



ADS1115 16 bit ADC 를 이용한 센서값 입력은 보다 정확한 값을 보장해 주네요.

향후 자주 사용해야 겠습니다.


And

Hardware | Digital Compass - HMC5883L 사용기 - 3

|

이 글은 전편 2개가 있습니다.


* Hardware | Digitial Compass - HMC5883L 사용기 - 1

https://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-1


* Hardware | Digital Compass - HMC5883L 사용기 - 2

https://chocoball.tistory.com/entry/Hardware-Digital-Compass-HMC5883L-2





1. Why calibration?


이 HMC5883L 이나, 기타 digital compass 는 영점조정이 필요합니다.

Calibration 을 하기 전은 정확성에 있어서 사용할 수 있는 물건이 아니라고도 할 정도 입니다.


또한 지구상에서 내가 어디에 있느냐에 따라 자력의 방향과 세기가 달라지므로, 공장에서 만들어 졌던 들,

이 영점 조정은 꼭 필요하게 된다는 이야기가 됩니다.


현재 위치하고 있는 지리적 장소에 따라 변하는 자력을 계산해 주는 사이트도 있습니다.


* NCEI Geomagnetic Calculators

https://www.ngdc.noaa.gov/geomag/calculators/magcalc.shtml






2. Yury Matselenak


아래 그림처럼 직각 육면체 (박스) 를 이용하여 영점 조정한 사람이 있습니다.


* Advanced hard and soft iron magnetometer calibration for dummies

https://diydrones.com/profiles/blogs/advanced-hard-and-soft-iron-magnetometer-calibration-for-dummies



영점 조절을 위한 arduino code, Visual Studio 2010 C# 을 이용한 검증 어플 및 계산 어플까지 all set 를 혼자 만드신 분이죠.

위의 블로그에서 가져온 소스를 여기에 올려 놓습니다.


MagMaster.rar


위의 압축파일에 모든게 들어 있습니다만,

한가지 아쉬운 것은, 2014년에 만들어진 코드라, 최신 Arduino IDE 에서는 제대로 동작하지 않습니다.

동작만 한다면, 이 분이 안내하고 만들어진 프로그램을 사용하여 영점 조정이 가능하나, 그러지 못했네요.


시간이 생기면 소스를 분석하고, geomagnetic 에 대해 공부하여 소스 개선을 좀 해주고 싶으나, 현재 그럴 여유는 없습니다.


Yuri 아저씨의 방식을 잠깐 설명해 보면, HMC5883L 센서는, PCB에 프린팅 된 XYZ 축의 모양에 따라 다음과 같은 축을 가집니다.



이 센서를 가지고 다음과 같이, 북쪽을 0도로 정하고 3차원 공간에서 XYZ 값을 가져오면, 틀어진 중심점을 알 수 있으니,

측정시에 그 틀어진 만큼을 빼주거나 더해주면 된다는 이론 입니다.



모두 12가지를 측정하여, 그 값들을 가지고 틀어진 중심점을 구하는 방식 입니다.





3. Sequential Quadratic Programming


측정된 값을 가지고 SQP (Sequential Quadratic Programming) 을 통해 최적의 영점을 잡아주는 방식도 있습니다.

(보다 기술적인 것은 잘 모름)


본 방식은, 아래 블로그에서 소개되었습니다.


* 電子コンパスHMC5883Lのキャリブレーションに挑戦

http://tomoto335.hatenablog.com/entry/arduino/HMC5883L


결과적으로 SQP 를 실행해야 하는데, 이를 Octave (상용 MatLab 의 GNU 버전) 을 통해서 답을 구할 수 있다고 하네요.

Yuri 아저씨 방식이 안되니, 이 방식으로 진행해 봅니다.





4. Octave


SQP 계산을 위해, 일단 Octave 를 설치해 봅니다.


* GNU Octave

https://www.gnu.org/software/octave/



사용하는 OS 에 맞게 다운로드 하구요.



인스톨 실행파일을 실행 시킵니다.



나에게 맞게 설정하구요.

저는 바탕화면이 지저분하게 되는게 싫어서 "Install for all users" 만 선택했습니다.

BLAS library 는 뭔지 모르니 그냥 OpenBLAS 로 놔뒀습니다.



Windows 10을 새로 깔았더니만 JRE 가 없네요. Octave 는 JRE 가 필요하다 합니다. 깔아 줍니다.



자 이제 다음으로 넘어갑니다.





5. 연결


우선 arduino 와 HML5883L 을 다음과 같이 연결합니다.


 HMC5883L | Arduino Nano
-------------------------
    VCC   |      5V
    GND   |      GND
    SCL   |      A5
    SDA   |      A4
-------------------------


그리고 I2CScanner / I2Cdetect 를 이요하여 address 0x1E 를 통해서 잘 인식 되었는지 확인합니다.



     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- 1e --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --


Hardware 준비는 끝났으니, arduino source 준비로 넘어갑니다.





6. 값을 입력받자


HMC5883L 을 구동시켜 주는 몇 가지 Library 들을 확인해 봤는데, Adafruit 에서 만든 Unified library 가 가장 짱인 것 같습니다.



OS 를 싹 밀었더니만 예전 library 가 다 날라갔네요. 깔끔하게 다시 설치해 줍니다.



바로 실행하면, Octave 에서 계산을 방해하는 문자들이 들어가니 아래와 같이 단순한게 XYZ 값만 입력받게 합니다.


#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_HMC5883_U.h"

/* Assign a unique ID to this sensor at the same time */
Adafruit_HMC5883_Unified mag = Adafruit_HMC5883_Unified(12345);


void setup(void) 
{
  Serial.begin(9600);
  
  /* Initialise the sensor */
  if(!mag.begin())
  {
    /* There was a problem detecting the HMC5883 ... check your connections */
    Serial.println("Ooops, no HMC5883 detected ... Check your wiring!");
    while(1);
  }
  
}

void loop(void) 
{
  /* Get a new sensor event */ 
  sensors_event_t event; 
  mag.getEvent(&event);
 
  /* Display the results (magnetic vector values are in micro-Tesla (uT)) */
  Serial.print(event.magnetic.x); Serial.print(",");
  Serial.print(event.magnetic.y); Serial.print(",");
  Serial.println(event.magnetic.z);
}


그러면 다음과 같은 결과들을 얻을 수 있습니다.


...
-21.82,-9.36,-41.94
-16.45,-8.73,-47.24
-16.45,-8.73,-47.24
-16.45,-8.73,-47.24
-9.64,-6.91,-51.43
-9.64,-6.91,-51.43
-9.64,-6.91,-51.43
-3.55,-4.00,-53.27
-3.55,-4.00,-53.27
-3.55,-4.00,-53.27
2.55,-1.27,-54.18
...


Serial Monitor 의 값들을 카피하여 txt 파일로 하나 만들어 놓습니다. 이게 Octave 에서 사용될 소스 값입니다.


참고로 Yuri 아저씨가 만들어 주신 MagMaster 프로그램 중에, MagViewer 라는게 있습니다.

실행시키면, 입력받을 Serial Port 를 물어보는데, arduino 와 연결된 port 를 지정하면 값들을 읽어와서 3차원 공간에 뿌려 줍니다.



훗, 확실히 틀어져 있군요.



동영상으로도 올려 봅니다. Graph Fetish 인지라, 이런거 보면 사족을 못 씁니다.

마우스로 요리조리 움직일 수 있어서 3차원 공간에서 어떻게 값들이 찍히는지 실시간으로 알 수 있습니다.





7. 영접을 찾아 보자


이제 Octave 에서 SQP 를 시켜 볼 차례 입니다.

Serial Monitor 에서 받은 값들을 파일로 만든 다음, Octave 내에서 아래 command 를 실행 시킵니다.


global points
points = csvread("HMC5883L_org_uncal.txt");
scatter3(points(:,1), points(:,2), points(:,3));


느낌이 예전 GNU Plot 을 사용하는 것이랑 매우 비슷하네요. Command 도 비슷하고.



짜잔~! 3차원으로 찍힌 그림을 그려줍니다. 이는 아까 MegViewer 로 본 모습이기도 합니다.



값들이 모두 입력 되었으니, 틀어진 값을 찾기 위해 SQP 해 봅니다.


function retval = sphere_errors(p, x)
  retval = sqrt( (p(:,1).-x(1)).^2+(p(:,2).-x(2)).^2+(p(:,3).-x(3)).^2).-x(4)
endfunction

function retval = sphere_error(x)
  global points
  retval = sum(sphere_errors(points, x).^2)
endfunction

x0 = [mean(points(:,1)), mean(points(:,2)), mean(points(:,3)), 100]

result = sqp(x0, @sphere_error)


그러면 한참만에 아래 값들이 도출됩니다. 모든 값들에 대해 mash 형태로 계산을 하다 보니, 꽤 시간이 걸립니다.



계산에 의하면, 중심점은 (12.1, -5.9, -7.2) 반경 47.85 라고 나옵니다.

이 값들이 지금까지 찾았던 영점값 되겠습니다.





8. 영접값 적용하여 확인


이제 다시 arduino source 로 돌아와, 위에서 구한 값들을 입력받는 source 에 반영해 줍니다.



중심점이 벗어나 있으니, 그만큼 가감해서, 입력 받을 때, 자동으로 계산되게 해주면 됩니다.


MegViewer 를 통해 어떻게 변했나 확인해 볼까요?



오호이~. 적용이 되어서 둥그런 원 모양과 중심축에 붙어서 값들이 표현되었습니다.

이게 calibration 의 힘이란 말인가... (대박)





9. Further More


사실 저는 이 결과가 썩 마음에 들지 않습니다.


일단, 값을 입력받는 방식 차제를 아래 그림들 처럼 고정된 상태에서 선의 걸리적 거림 없이,

6면체의 각 면과 같이 회전하면서 값들을 받아야, 입력값을 신뢰할 수 있을 것 같았습니다.


Arduino GY-273 HMC5883L Magnetometer Compass Tutorial

http://henrysbench.capnfatz.com/henrys-bench/arduino-sensors-and-input/arduino-gy-273-hmc5883l-magnetometer-compass-tutorial/



위와 같이 하려면, 아래 장치 처럼, 무선모듈을 추가해야 하고, 배터리로 구동시켜야 합니다.


* Tutorial: How to calibrate a compass (and accelerometer) with Arduino

https://thecavepearlproject.org/2015/05/22/calibrating-any-compass-or-accelerometer-for-arduino/



저는 이렇게 연결하고 윙윙 휘둘렀습니다.

그래서 몇 개씩 값이 튀기도 하고...



혹시... 혹시 나중에 기회가 되면, 그땐 위의 전문가들 처럼 해보고 싶네요.


And