Sử dụng cảm biến gia tốc(Accelerometers) và cảm biến con quay hồi chuyển (Gyroscopes)

02 tháng 08, năm nay – 2894 lượt xemMột trong những thứ mà tôi cảm thấy tuyệt vời nhất so với một chiếc smartphone là nó có năng lực cảm ứng hoạt động và hướng. Với những thiết bị của Apple bạn hoàn toàn có thể sử dụng cảm ứng tần suất ( Accelerometers ) và cảm ứng con quay hồi chuyển ( Gyroscopes ) theo 3 trục x, y, z. Trong bài viết này tất cả chúng ta sẽ cùng nhau tạo ra một ứng dụng nhỏ để khám phá qua về chúng .

I)Tạo giao diện

– Giao diện của tất cả chúng ta sẽ làm một cách đơn thuần nhất để hoàn toàn có thể hiển thị 12 vía trị. Chúng ta sẽ theo dõi được giá trị cao nhất giá trị hiện tại của Acceleration và góc xoay theo chiều trục X, Y, Z .

-Sau khi tạo project mới các bạn vào storyboards.

– Ở storyboards những bạn kéo 25 labels vào view. Chúng ta sẽ lấy ra 12 labels để hiển thị tài liệu về mỗi trục X, Y, Z. Các bạn bạn biến hóa tên những labels và thêm 1 cái nút theo hình dưới đây .

Tiếp theo tất cả chúng ta sẽ link những đối tượng người dùng ngoài view vào trong file viewcontroller. Các bặt đặt tên tương ứng với những đôi tượng ngoài view và action của nút những bạn đặt tên resetMaxValue .

import CoreMotion
class ViewController: UIViewController{
    @IBOutlet weak var rollLabel: UILabel!
    @IBOutlet weak var pinchLabel: UILabel!
    @IBOutlet weak var yawLabel: UILabel!
    
    @IBOutlet var accX: UILabel!
    @IBOutlet var accY: UILabel!
    @IBOutlet var accZ: UILabel!
    
    @IBOutlet var maxAccX: UILabel!
    @IBOutlet var maxAccY: UILabel!
    @IBOutlet var maxAccZ: UILabel!
    
    @IBOutlet var rotX: UILabel!
    @IBOutlet var rotY: UILabel!
    @IBOutlet var rotZ: UILabel!
    
    @IBOutlet var maxRotX: UILabel!
    @IBOutlet var maxRotY: UILabel!
    @IBOutlet var maxRotZ: UILabel!
    
    
    @IBAction func resetMaxValues(sender: AnyObject) 
    {
    }
}

II) Cảm biến gia tốc(Accelerometer) và Cảm biến con quay hồi chuyển(Gyroscope)

Cảm biến gia tốc(Accelerometer)

Cảm biến gia tốc nó được sử dụng để đo gia tốc theo 3 chiều có nghĩa là ví dụ bạn lắc thiết bị mạnh thì giá trị các trục của nó cao và người lại.

– Khi thiết bị của bạn đặt trên bàn với mặt hình hướng lên trên thì máy đo tần suất sẽ có giá trị là – 1G theo chiều Z, và nếu mặt điện thoại cảm ứng úp xuống thì nó có giá trị 1G theo chiều Z .- Nếu bạn giữ thẳng đứng chiếc điện thoại thông minh thì giá trị sẽ là – 1G theo trục Y và xoay ngược lại thì sẽ là 1G. Tương tự khi bạn để màn hình hiển thị điện thoại thông minh trước mặt mà xoay 1 góc 90 độ về bên trái thì bạn sẽ nhận được giá trị – 1G theo trục X và ngược lại nếu quay bên phải bạn sẽ nhận giá trị là 1G .

Cảm biến con quay hồi chuyển(Gyroscope)

– Con quay hồi chuyển cảm ứng được góc quay giữa những trục XYZ. Cùng với accelerometer là 2 công cụ cơ bản để cảm ứng hành vi .

III)Viết mã để test

Trong bài hướng dẫn này chúng ta sẽ sử dụng CoreMotion. Để thêm Core Motion vào ứng dụng ở target của ứng dụng ở Linked Frameworks and Libraries các bạn thêm Core Motion.

Bây giờ những bạn import Core Motion vào file ViewController. Tiép theo tất cả chúng ta sẽ thêm một số ít biến toàn cục có kiểu double để lưu giá trị max của cảm ứng tần suất và sau đó tất cả chúng ta tạo thêm một thuộc tính có kiểu CMMotionManager .Dưới đây là đoạn mã của file ViewController :

    //Instance Variables
    
    var currentMaxAccelX: Double = 0.0
    var currentMaxAccelY: Double = 0.0
    var currentMaxAccelZ: Double = 0.0
    
    var currentMaxRotX: Double = 0.0
    var currentMaxRotY: Double = 0.0
    var currentMaxRotZ: Double = 0.0
    
    var movementManager = CMMotionManager()
    
    //Outlets
    
    @IBOutlet var accX: UILabel!
    @IBOutlet var accY: UILabel!
    @IBOutlet var accZ: UILabel!
    
    @IBOutlet var maxAccX: UILabel!
    @IBOutlet var maxAccY: UILabel!
    @IBOutlet var maxAccZ: UILabel!
    
    @IBOutlet var rotX: UILabel!
    @IBOutlet var rotY: UILabel!
    @IBOutlet var rotZ: UILabel!
    
    @IBOutlet var maxRotX: UILabel!
    @IBOutlet var maxRotY: UILabel!
    @IBOutlet var maxRotZ: UILabel!
    
    
    @IBAction func resetMaxValues(sender: AnyObject) {
    }

Tiếp theo tất cả chúng ta sẽ khởi tạo giá trị cho những biến :

override func viewDidLoad() {
        
        currentMaxAccelX = 0
        currentMaxAccelY = 0
        currentMaxAccelZ = 0
        
        currentMaxRotX = 0
        currentMaxRotY = 0
        currentMaxRotZ = 0
        
        movementManager.gyroUpdateInterval = 0.2
        movementManager.accelerometerUpdateInterval = 0.2
        
        //Start Recording Data        
        movementManager.startAccelerometerUpdatesToQueue(NSOperationQueue.currentQueue()!) { (accelerometerData: CMAccelerometerData?, NSError) -> Void in
            
            self.outputAccData(accelerometerData!.acceleration)
            if(NSError != nil) {
                print("\(NSError)")
            }
        }
        
        movementManager.startGyroUpdatesToQueue(NSOperationQueue.currentQueue()!, withHandler: { (gyroData: CMGyroData?, NSError) -> Void in
            self.outputRotData(gyroData!.rotationRate)
            if (NSError != nil){
                print("\(NSError)")
            }  
        })  
    }

Trong đoạn mã này, tất cả chúng ta đâu tiên set giá trị 0 cho kiểu double. Sau đó tất cả chúng ta khởi tạo biến motionManager, tiếp theo tất cả chúng ta update khoảng chừng thời hạn update theo mini giây .Tiếp theo tất cả chúng ta gọi phương pháp startAccelerometerUpdatesToQueue từ biến motionManager, phương pháp trên sẽ nói cho thuộc tính motionManger mở màn gửi những cảm ứng tần suất ….Tiếp theo tất cả chúng ta sẽ gọi những phương pháp outputAccelertionData để update tài liệu lên giao diện .Dưới đây là code của 2 phương pháp :

func outputAccData(acceleration: CMAcceleration){
        
        accX?.text = "\(acceleration.x).2fg"
        if fabs(acceleration.x) > fabs(currentMaxAccelX)
        {
            currentMaxAccelX = acceleration.x
        }
        
        accY?.text = "\(acceleration.y).2fg"
        if fabs(acceleration.y) > fabs(currentMaxAccelY)
        {
            currentMaxAccelY = acceleration.y
        }
        
        accZ?.text = "\(acceleration.z).2fg"
        if fabs(acceleration.z) > fabs(currentMaxAccelZ)
        {
            currentMaxAccelZ = acceleration.z
        }
        maxAccX?.text = "\(currentMaxAccelX).2f"
        maxAccY?.text = "\(currentMaxAccelY).2f"
        maxAccZ?.text = "\(currentMaxAccelZ).2f"
        
        
    }
    
    func outputRotData(rotation: CMRotationRate){
        rotX?.text = "\(rotation.x).2fr/s"
        if fabs(rotation.x) > fabs(currentMaxRotX)
        {
            currentMaxRotX = rotation.x
        }
        
        rotY?.text = "\(rotation.y).2fr/s"
        if fabs(rotation.y) > fabs(currentMaxRotY)
        {
            currentMaxRotY = rotation.y
        }
        
        rotZ?.text = "\(rotation.z).2fr/s"
        if fabs(rotation.z) > fabs(currentMaxRotZ)
        {
            currentMaxRotZ = rotation.z
        }
        maxRotX?.text = "\(currentMaxRotX).2f"
        maxRotY?.text = "\(currentMaxRotY).2f"
        maxRotZ?.text = "\(currentMaxRotZ).2f"
    }

Và sau cuối tất cả chúng ta sẽ cần là viết mã cho nút resetMaxValues :

@IBAction func resetMaxValues(sender: AnyObject) {
        currentMaxAccelX = 0
        currentMaxAccelY = 0
        currentMaxAccelZ = 0
        
        currentMaxRotX = 0
        currentMaxRotY = 0
        currentMaxRotZ = 0
    }

Nếu bạn chạy bạn có thể thấy màn hình như dưới đây, nhưng chú ý các bạn sẽ phải chạy ở thiết bị thật.

Nguồn bài viếtTham gia ngay khoá học lập trình iOS, hình thức học tập rất linh động cho bạn lựa chọn và sẽ có mức học phí khác nhau tuỳ theo bạn chọn học Online, Offline hoặc FlipLearning ( Kết hợp giữa Online và Offline ). Ngoài ra bạn hoàn toàn có thể tham gia thực tập toàn thời hạn tại Techmaster để rút ngắn thời hạn học và tăng thời cơ việc làm .

Source: https://blogchiase247.net
Category: Hỏi Đáp

Rate this post